2009-11-09 49 views
0

以下是我们使用线程/调度程序进行多任务处理的两种方法: 我在想如果有人有任何建议哪一个更好选项。WPF线程问题更好选项

片段1:

Thread t = new Thread(new ThreadStart(delegate 
       { 
        MyMethod(); 
       })); 
t.IsBackground = true; 
t.Start(); 
t.Join(); 

片段2:

Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, 
      (dummyDelegate)delegate 
      { 
       MyMethod(); 

      } 
    ); 

请指教。 谢谢 N

+0

也许原来的海报意味着在代码片段2中使用this.Dispatcher.Invoke来运行此对象所属UI线程上的代码?使用Dispatcher.CurrentDispatcher只是在同一个线程上同步执行代码。 – Anton 2009-11-09 03:24:42

回答

0

任何错误使用老好人BackgroundWorker?

,让您可以在WPF中使用它,它不是具体的WinForms。

2

两者都不是“更好”:它们是不同的。

第一个示例在后台线程上运行MyMethod。因此,如果MyMethod阻塞,例如在网络活动或执行一些计算密集的事情,这不会阻止UI线程,并且UI保持响应。 (尽管你的示例代码会阻止并等待,但是你目前正在失去这个优势。)缺点是如果MyMethod想要读取或更新UI,必须跳过一些小圈子。

第二个示例在UI线程上运行MyMethod。这允许MyMethod与UI中的元素进行无限制的交互,但如果MyMethod花费很长时间,因为它在MyMethod运行时冻结UI,则不适用。

所以这取决于MyMethod的功能。如果MyMethod更新了几个UI元素,然后退出,请使用第二个选项。如果MyMethod加载文件或下载数据,和/或执行冗长的计算,请使用第一个。

1

还有第三种选择:使用线程池执行短暂的异步调用。例如:

System.Threading.Threadpool.QueueUserWorkItem(
    delegate(object context) 
    { 
     // context is unused 
     MyMethod(); 
    }); 

这将使用线程池中的一个线程来执行MyMethod。该方法完成后,该线程将返回到池中。这种方法的优点是你不必自己管理线程的生命周期,也不需要创建和销毁线程的内存和性能开销。