【问题标题】:multiple backgroundworker queueing多个后台工作人员排队
【发布时间】:2012-06-21 20:08:16
【问题描述】:

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

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

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

    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 对象或类似的对象应用锁定吗?谢谢,

【问题讨论】:

  • 你必须使用后台工作人员吗?使用任务将是一个非常好的解决方案。 msdn.microsoft.com/en-us/library/dd235608
  • 感谢您的链接,它非常有用,但不知道。 BackgroundWorker 不是强制性的,我认为这是一种防止在应用运行时阻塞 UI 的方法。
  • 是的,BackgroundWorker 适用于快速简单的应用程序,以防止 UI 阻塞。对于更高级的内容,请使用任务。 .net 4 中的 TPL 很棒!

标签: c# winforms asynchronous backgroundworker


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您只能使用一名后台工作人员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      相关资源
      最近更新 更多