首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF穿线抓包

WPF穿线抓包
EN

Stack Overflow用户
提问于 2011-06-07 21:07:25
回答 1查看 277关注 0票数 1

我已经开发了一个有趣的WPF控件,它目前正在减慢我的整个应用程序:)在我的自定义控件上,我有一个图像控件,我需要在每次后端事件发生时更新它。这个后端事件每秒触发两次(非常快)。当事件触发时,我需要从第三方控件中拉出一个Bitmap对象,转换为BitmapSource对象,然后将其绑定到我的图像控件。每次触发我的事件时,我都会在ThreadPool中排队一个新的工作项。然后,该项目将获取位图,并在后台worker对象中执行转换。每次触发事件时都会执行此操作。我正在使用dispatcher和BeginInvoke更新我的图像控制源,但我仍然得到一个没有响应的应用程序。请让我知道我可以做些什么来让这个过程更好地执行,并帮助我的应用程序更具响应性:

下面是我的事件中的代码:

代码语言:javascript
复制
void inSight_ResultsChanged(object sender, EventArgs e)
        {

            ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessEvent), ((InSightViewer)this.DataContext).CvsDisplay);
        }

以下是delegate的代码:

代码语言:javascript
复制
void ProcessEvent(object display)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            bw.RunWorkerAsync(display);

        }

下面是我的后台worker DoWork事件中的代码:

代码语言:javascript
复制
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事件中的代码:

代码语言:javascript
复制
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, (ThreadStart)delegate()
        {
            this.imgSource.Source = (BitmapSource)e.Result;
        });
}
EN

回答 1

Stack Overflow用户

发布于 2011-06-15 14:55:23

代码语言:javascript
复制
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表示在应用程序空闲时处理操作。

如果应用程序总是忙碌而从不空闲,该怎么办?请求将被排队,应用程序速度会变慢。

然而,我没有测试这个,因为我没有你的应用程序的源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6265633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档