计时器与重复的背景工作者

Ais*_*iva 2 c# wcf multithreading timer winforms

我正在开发一个Windows窗体应用程序,它在指定的时间间隔后调用WCF服务,并根据从服务接收的数据显示输出.我有一个计划为此目的使用计时器,在500毫秒后调用该WCF服务方法.但我的一些同事告诉我使用后台工作人员然后Work_Completed重新运行工作人员.我想知道这两者有什么区别?timer还会创建后台线程吗?哪一个最适合长时间运行的任务?

Der*_*rek 6

来自MSDN网站: -

BackgroundWorker在ThreadPool上创建一个线程(通过异步委托调用).BCL计时器使用ThreadPool线程来引发事件,或者在某些情况下会引发UI线程上的tick/elapsed/etc事件(在WinForms计时器或提供了ISynchronizeInvoke的Timers.Timer的情况下) ).

BackgroundWorker为UI环境中的后台线程提供了最佳API.它允许一个方法在后台线程上运行(通过DoWork事件),并提供一种简单的方法来通知UI线程(ProgressChanged和RunWorkerCOmpleted事件)的进度和完成,而不必担心任何跨线程调用.

WinForms计时器在UI线程上执行,可以安全地触摸其已用事件中的任何UI元素.但是,您不能保证按照确切的时间间隔执行,它完全取决于UI线程上发生的事情.让我重复一件重要的事情:这个选项没有后台线程!

Threading.Timer是一种"丑陋的API"计时器.Timers.Timer简单地将Threading.Timer包装到更好的API中,并提供了一种在UI线程上自动调用已用事件的方法(通过SynchronizingObject属性).如果设置SynchronizingObject属性,后台线程上不执行代码,则会立即将其编组到UI线程.

通常,在UI中,BackgroundWorker比其他选择更容易处理.


Ser*_*rvy 5

Timer就资源消耗而言,A 几乎肯定更合适.A BackgroundWorker将为该任务创建一个新线程.创建新线程是一项相当昂贵的操作.虽然有许多不同的计时器实现,并且它们的实现会有所不同,但它们通常依赖于将定期触发事件的OS工具,这对于启动新的专用线程更为可取.

Timer对象中的大多数关键差异都是他们"准备好"时所做的事情.有些人创建了一个新的线程池线程; 有些专用线程由计时器的所有实例共享以运行处理程序,有些则将代码编组到UI线程(或其他一些同步上下文),而后者则是您可能想要的.如果您使用在您正在使用的特定UI框架中可用的计时器,那么您将看到的行为.