WPF Захватывающая сумка - PullRequest
1 голос
/ 07 июня 2011

Я разработал интересный элемент управления 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;
        });
}

1 Ответ

0 голосов
/ 15 июня 2011
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
        Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, (ThreadStart)delegate()
        {
            this.imgSource.Source = (BitmapSource)e.Result;
        });
}

System.Windows.Threading.DispatcherPriority. ApplicationIdle означает, что операции обрабатываются, когда приложение находится в режиме ожидания.

Что если приложение всегда занято и никогда не находится в режиме ожидания?Запросы будут поставлены в очередь, и приложение замедлится.

Однако я не проверял это, потому что у меня нет исходного кода вашего приложения.

...