Я разработал интересный элемент управления WPF, который в настоящее время замедляет работу всего моего приложения :) В моем пользовательском элементе управления есть элемент управления изображением, который мне нужно обновлять каждый раз, когда происходит событие бэкэнда.Это внутреннее событие запускается дважды в секунду (очень быстро).Когда происходит событие, мне нужно вытащить объект Bitmap из стороннего элемента управления, преобразовать его в объект BitmapSource и затем связать его с моим элементом управления Image.Каждый раз, когда мое событие запускается, я ставлю в очередь новый рабочий элемент в ThreadPool.Затем элемент извлекает растровое изображение и выполняет преобразование в фоновом рабочем объекте.Это делается каждый раз, когда происходит событие.Я использую диспетчер для обновления источника управления изображениями с помощью BeginInvoke, но приложение все еще не отвечает.Пожалуйста, дайте мне знать, что я могу сделать, чтобы этот процесс стал более эффективным, и помогите сделать мое приложение более отзывчивым:
Вот код моего мероприятия:
void inSight_ResultsChanged(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessEvent), ((InSightViewer)this.DataContext).CvsDisplay);
}
Вот кодот делегата:
void ProcessEvent(object display)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync(display);
}
Вот код в моем фоновом рабочем событии DoWork:
void bw_DoWork(object sender, DoWorkEventArgs e)
{
3rdPartyControl displayControl = new 3rdPartyControl();
displayControl.ImageHost = (ImgHost)e.Argument;
Bitmap b = displayControl.GetBitmap();
var mBitmap = b.GetHbitmap();
BitmapSource bs;
try
{
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
mBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
bs.Freeze();
}
catch (System.Exception ex) { throw ex; }
finally
{
DeleteObject(mBitmap);
}
e.Result = bs;
}
Вот код в событии RunWorkerCompleted:
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, (ThreadStart)delegate()
{
this.imgSource.Source = (BitmapSource)e.Result;
});
}