gpt4 book ai didi

c# - 集合项中使用的 BackgroundWorker

转载 作者:行者123 更新时间:2023-11-30 14:20:27 25 4
gpt4 key购买 nike

为了完成一些耗时的工作,我使用了一个Backgroudworker来做一些工作。

public void ConnectDataProvider()
{
bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);

}

另一种方法启动后台 worker :

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();
}

如您所见,我在完成后重新启动了 worker。现在这适用于单个后台工作人员。

现在我想要一个集合,每个项目都应该执行这个任务。然而,根据上面的概念,它只会在第一个启动的 worker 中继续运行,因为它会重新启动 worker。我在想,也许 Timer 的组合可以解决这种情况,让其他工作线程有办法。

BackgroundWorker 仍然是一个不错的选择吗?像我一样重用 BackgroundWorker 是否很常见?

编辑 1: 澄清一下:我面临的问题是,我需要使用各自的 BackgroundWorker 来管理集合。我正在考虑一个计时器,以定期从每个项目中触发请求。这就是我被困的地方。

编辑 2: 查看我自己的答案,我没有解决这个问题,但发现我可以配合计时器来获得我想要的东西。

编辑 3: 澄清(又一次尝试,我不擅长)我想要实现的目标:我有跟踪对象,用于 gps 跟踪。我想跟踪一大堆,所以每个跟踪设备一个对象。他们都需要经常轮询。我为单个测试对象设置了一个 BackgroundWorker。我喜欢后台工作人员在完成时告诉我的方式。但我无法让它与所有跟踪对象一起使用。

现在每个跟踪对象都有自己的计时器。此计时器生成一个新线程并执行耗时的工作(我将其命名为 DoWrite)。不需要 BackgroundWorker,因为我处理了计时器,然后创建了一个新计时器。这就是它所做的全部。

最佳答案

其中可能有多少个?在集合中的项和线程之间创建 1:1 关系时应小心。另一个编码员可能会出现并比您计划的更多地扩展这个集合。

对于这样的事情,我通常喜欢只使用一个线程和一个队列——所以事件只是把需要完成的工作放在一个 ConcurrentQueue 中,线程在没有运行的情况下启动,并在排队的队列中搅动工作到无事可做,然后死去。下次有更多工作进入时,该事件将检查线程是否正在运行并启动它。

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

关于c# - 集合项中使用的 BackgroundWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1292422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com