到目前为止,在我的Windows Phone 7应用程序开发经验中,我注意到在异步线程中运行操作有不同的方法。
我看不出这些方法之间有任何明显的区别(除了前两个方法更易于追踪)。
在使用这些方法之前,你们有什么事情要考虑吗?你更喜欢哪一个?为什么?
答案 0 :(得分:15)
问题有点回答,但答案有点细节(IMO)。
让我们轮流拍摄。
<强> System.Threading.Thread 强>
所有线程(无论如何都在CLR中)最终由此类表示。但是,当我们想要自己创建实例时,您可能会将其包括在内进行查询。
答案很少。通常,调度后台任务的日常工作是Threadpool
。但是在某些情况下我们想要创建自己的线程。通常,这样的线程将适用于大多数app运行时。它的大部分时间都会在一些等待句柄上被阻止。偶尔我们会发出这个句柄的信号,然后它就可以做一些重要的事情,但之后又会重新入睡。我们没有使用Threadpool工作项,因为我们不支持这样的想法,即它可能会在一大堆未完成的任务后面排队,其中一些任务可能会在其他一些等待时被阻止(或许不会被阻止)。 p>
<强> System.ComponentModel.BackgroundWorker 强>
这是ThreadPool工作项的友好类包装器。这个类只面向面向UI的开发人员偶尔需要使用后台线程。它在UI线程上调度的事件使其易于使用。
<强> System.Threading.ThreadPool.QueueUserWorkItem 强>
这是日常的主力,当你想要在后台线程上做一些工作时。这消除了分配和取消分配单个线程以执行某些任务的费用。它限制了线程实例的数量,以防止太多的可用资源被太多的操作吞并,试图并行运行。
QueueUserWorkItem
是我首选的调用后台操作的选项。
答案 1 :(得分:1)
它可能取决于你想要做什么,你已经列出了3种截然不同的线程模型。
您是否阅读过MSDN等...
http://www.albahari.com/threadin
Http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx
答案 2 :(得分:1)
你没有说“为什么”,但是
我认为SL不支持TPL,这很可惜。
答案 3 :(得分:0)
当你的UI需要随着线程的进展而更新时,后台工作者往往会更好地使用,因为它处理在UI线程而不是后台线程上调用回调函数(例如OnProgress回调)。另外两个不做这项工作。你应该这样做。