以下是我们尝试使用线程/调度程序进行多任务处理的两种方法: 我想知道是否有人有任何建议哪个是更好的选择。
摘录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();
}
);
请指教。 谢谢 Ñ
答案 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中使用它。