public void ConnectDataProvider() { bgw = new BackgroundWorker(); bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted); }
另一种方法启动后台工作程序:
public void StartPolling() { bgw.RunWorkerAsync(); }
然后我做了事件处理:
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // do it over again StartPolling(); } void bgw_DoWork(object sender, DoWorkEventArgs e) { // do work WriteData(); }
正如你所看到的,我完成了工作人员.现在这适用于单个背景工作者.
现在我想要一个集合,每个项目都应该执行此任务.然而,根据上面的概念,它将继续在第一个工作者开始运行,因为它启动了工作人员.我在想,也许一个Timer组合可以解决这种情况,让其他工作者的线程方式.
BackgroundWorker仍然是一个不错的选择吗?像我一样重复使用BackgroundWorker是常见的吗?
编辑1:要求:我面临的问题是,我需要使用自己的BackgroundWorker来管理集合.我正在考虑一个计时器,定期从每个项目中提出请求.这就是我被困住的地方.
编辑2:看到我自己的答案,我没有解决这个问题,但发现我可以跟定时器一起得到我想要的东西.
编辑3:澄清(另一次尝试,我不擅长)我想要实现的目标:我有跟踪对象,用于gps跟踪.我想跟踪它们中的一大堆,因此每个跟踪设备都有一个对象.他们都需要经常接受调查.我为一个测试对象设置了BackgroundWorker.我喜欢他们的方式,背景工作者会告诉我它什么时候完成.但我无法使用所有跟踪对象.
现在每个跟踪对象都有自己的计时器.这个计时器产生一个新线程并完成耗时的工作(我将其命名为DoWrite).不需要BackgroundWorker,因为我处理了计时器,然后创建了一个新的计时器.就是这样.
这些可能有多少?您应该小心在集合和线程中的项之间创建1:1关系.另一个程序员可能会比你计划的更多地扩展这个系列.对于这样的事情,我通常只想使用一个线程和一个队列 – 因此事件只需要在ConcurrentQueue中完成需要完成的工作,如果没有运行则线程启动,并通过排队的工作进行搅拌,直到它为止没事做,死了.下次更多的工作将在事件中检查线程是否正在运行并启动它.
它更便宜,因为如果有很多事情发生,你只运行一个线程而不是停止并启动很多线程,或者如果进行的很少,那么一个线程几乎从不运行.