WPF线程问题更好的选择

时间:2009-11-09 03:00:19

标签: wpf multithreading

以下是我们尝试使用线程/调度程序进行多任务处理的两种方法: 我想知道是否有人有任何建议哪个是更好的选择。

摘录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();

           }
    );

请指教。 谢谢 Ñ

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

还有第三种选择:使用Threadpool执行短期异步调用。例如:

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

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

答案 2 :(得分:0)

使用good ole BackgroundWorker?

有什么问题

这不是特定于WinForms的,所以你仍然可以在WPF中使用它。