gpt4 book ai didi

c# - 多个 backgroundworker 排队

转载 作者:行者123 更新时间:2023-11-30 21:06:30 26 4
gpt4 key购买 nike

在我的 winforms 应用程序中,我有一个包含对象的队列:

    Queue<MyObj> _queuedRows = new Queue<MyObj>();

对于每个对象,我必须启动一个单独的 backgroundworker 来完成一些耗时的工作。

    private void DoAll(List<MyObj> lst)
{
foreach (MyObj o in lst)
{
_queuedRows.Enqueue(o);
}

while (_queuedRows.Any())
DoSingle();
}

private void DoSingle()
{
if (!isCancelPending())
{
if (_queuedRows.Any())
{
MyObj currentObj = _queuedRows.Dequeue();
InitBackgroundWorker(currentObj);
}
}
}

private void InitBackgroundWorker(MyObj currentObj)
{
BackgroundWorker _worker = new BackgroundWorker();
_worker.WorkerSupportsCancellation = true;
_worker.WorkerReportsProgress = true;
_worker.DoWork += new DoWorkEventHandler(worker_DoWork);
_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

if (!_worker.IsBusy && currentObj != null)
_worker.RunWorkerAsync(currentObj);
}

我的问题是,在调用 RunWorkerAsync 之后,执行跳转到 while 的下一次迭代(这是合乎逻辑的,因为 worker 正在运行异步并且它允许下一次迭代发生)。

我实际上需要做的是以某种方式告诉应用程序等待,直到后台工作人员完成工作,然后它才应该通过继续调用 DoSingle() 来开始下一次迭代。

我应该对 _queuedRows 对象或类似对象应用锁定吗?谢谢,

最佳答案

不是在 while 循环中调用 DoSingle,而是将其更改为调用一次 DoSingle,然后在后台 worker 的 RunWorkerCompleted 事件处理程序中调用 DoSingle 一次又一次,直到队列完成。

    private void DoAll(List<MyObj> lst)
{
foreach (MyObj o in lst)
{
_queuedRows.Enqueue(o);
}

if (_queuedRows.Any())
DoSingle();
}

此外,由于您没有并行处理队列中的所有对象,因此只实例化后台工作程序一次并重用它。

关于c# - 多个 backgroundworker 排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145938/

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