当前位置 : 主页 > 编程语言 > c语言 >

c# – 在集合项中使用的BackgroundWorker

来源:互联网 收集:自由互联 发布时间:2021-06-25
我使用Backgroudworker做一些工作,以便做一些耗时的任务. public void ConnectDataProvider() { bgw = new BackgroundWorker(); bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); bgw.RunWorkerCompleted += new RunWorkerCompletedEven
我使用Backgroudworker做一些工作,以便做一些耗时的任务.

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中完成需要完成的工作,如果没有运行则线程启动,并通过排队的工作进行搅拌,直到它为止没事做,死了.下次更多的工作将在事件中检查线程是否正在运行并启动它.

它更便宜,因为如果有很多事情发生,你只运行一个线程而不是停止并启动很多线程,或者如果进行的很少,那么一个线程几乎从不运行.

网友评论