Windows Phone中的后台线程

时间:2011-11-08 21:13:40

标签: c# silverlight windows-phone-7

到目前为止,在我的Windows Phone 7应用程序开发经验中,我注意到在异步线程中运行操作有不同的方法。

  1. System.Threading.Thread
  2. System.ComponentModel.BackgroundWorker
  3. System.Threading.ThreadPool.QueueUserWorkItem()
  4. 我看不出这些方法之间有任何明显的区别(除了前两个方法更易于追踪)。

    在使用这些方法之前,你们有什么事情要考虑吗?你更喜欢哪一个?为什么?

4 个答案:

答案 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种截然不同的线程模型。

  1. 基本线程
  2. 专为具有单独UI线程的应用程序而设计。
  3. 托管线程池
  4. 您是否阅读过MSDN等...

    http://www.albahari.com/threadin

    Http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

答案 2 :(得分:1)

你没有说“为什么”,但是

  1. 基本线程 - 非常昂贵,不适合小型工作
  2. Backgroundworker - 主要用于UI + Progressbar工作
  3. ThreadPool - 适用于小型独立工作
  4. 我认为SL不支持TPL,这很可惜。

答案 3 :(得分:0)

当你的UI需要随着线程的进展而更新时,后台工作者往往会更好地使用,因为它处理在UI线程而不是后台线程上调用回调函数(例如OnProgress回调)。另外两个不做这项工作。你应该这样做。