在我进行Windows Phone 7应用程序开发的经验中,我注意到有多种方法可以在异步线程中运行操作。
- System.Threading.Thread
- System.ComponentModel.BackgroundWorker
- System.Threading.ThreadPool.QueueUserWorkItem()
除了前两种方法更易追踪之外,我没有看到这些方法之间有任何明显的区别。
在使用这些方法之前,您是否考虑过什么?您会选择哪个方法,并为什么选择它?
在我进行Windows Phone 7应用程序开发的经验中,我注意到有多种方法可以在异步线程中运行操作。
除了前两种方法更易追踪之外,我没有看到这些方法之间有任何明显的区别。
在使用这些方法之前,您是否考虑过什么?您会选择哪个方法,并为什么选择它?
这个问题已经有了答案,但是我认为答案缺少了一些细节。
让我们依次来看。
System.Threading.Thread
所有线程(至少在CLR中)最终都由该类表示。但是你可能包含它是为了查询何时需要自己创建实例。
答案很少。通常,在日常工作中调度后台任务的重要工具是Threadpool
。但是,在某些情况下,我们确实需要创建自己的线程。通常这样的线程会在大部分应用程序运行时存在。它将在某些等待句柄上被阻塞并花费大部分时间。偶尔,我们会发出此句柄的信号并唤醒它以执行一些重要操作,然后它就会回到睡眠状态。对于此操作,我们不使用Threadpool工作项,因为我们不能容忍它可能排队在一组未完成的任务后面,其中一些任务本身(可能无意中)被阻塞在其他等待句柄上。
System.ComponentModel.BackgroundWorker
这是一个友好的类封装,可以使用线程池工作项。这个类仅面向UI导向的开发人员,他们偶尔需要使用后台线程。它的事件在UI线程上分派,使其易于消耗。
System.Threading.ThreadPool.QueueUserWorkItem
这是当您需要在后台线程上执行某些任务时的日常工作工具。这消除了为执行某些任务分配和释放单个线程的开销。它限制了线程实例的数量,以防止太多的操作尝试并行运行而占用太多可用资源。
QueueUserWorkItem
是我首选的调用后台操作的选项。
Thread
类的 IsBackground
属性得到支持,但根据文档,“两者之间的行为没有区别”。 - AnthonyWJones这可能取决于你想要做什么,因为你列出了三种非常不同的线程模型。
你是否阅读过MSDN等相关文档?
http://www.albahari.com/threadin
Http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx
你没有说明“为什么”,但是
我认为TPL在SL中不受支持,这很遗憾。
当您的线程进展时,如果您的UI需要更新,则后台工作程序往往更好使用,因为它会在UI线程上处理调用回调函数(例如OnProgress回调),而不是在后台线程上。其他两个不会执行此操作。这取决于您自己来完成。