【问题标题】:How to start BackgroundWorker after CancelAsync如何在 CancelAsync 后启动 BackgroundWorker
【发布时间】:2011-07-27 17:41:11
【问题描述】:

我在 UserControls 中使用 backgroundworker,我通过单击按钮将其加载到面板中。 我在一个 UC 中点击了 CancelAsync BW,然后我转到另一个 UC。当我想返回之前的 UС(我已经取消了 BW)时,我总是输入 RunWorkerCompleted 事件。

我尝试在 UC 构造函数中重新初始化 BW:

bgrWorker = new BackgroundWorker
        {
            WorkerSupportsCancellation = true,
            WorkerReportsProgress = true
        };

        bgrWorker.DoWork += DoWork;
        bgrWorker.ProgressChanged += ProgressChanged;
        bgrWorker.RunWorkerCompleted += RunWorkerCompleted;

        btnStop.Click += StopWorker;

但它不起作用。

DoWork 事件代码:

System.Threading.Tasks.Parallel.For(0, _list.Count, num =>
            {
                if (bgrWorker.CancellationPending)
                {
                    e.Cancel = true;
                }
                else
                {
                    _splittedList.Add(FindMiddle.Find(_list[num], 20));
                    bgrWorker.ReportProgress(0);
                }
            });

【问题讨论】:

  • 如果你有两个不同的BackgroundWorker,他们应该是独立的。目前尚不清楚发生了什么 - 但如果您可以编写一个简短但完整的程序,它会更清晰。
  • 他们是独立的。我有几个 UC,每个都有一个 BW。
  • 那么取消一个应该对另一个没有影响......但是一旦你已经取消了一个,你将不得不重新创建它,我怀疑。
  • 我试过这个:我试过在UC构造函数中重新初始化BW
  • 是的,我读到了——但是当您“返回到以前的 UC”时,这大概是 再次调用构造函数,是吗? (在构造函数中 redo 的想法一开始很奇怪。)就你在做什么而言,你的问题仍然很不清楚 - 再次,一个简短但完整的程序将有很大帮助.

标签: c# winforms user-controls backgroundworker


【解决方案1】:

(按照 cmets 中的说明 :)

当您返回到之前的用户控件时,它不会重新运行构造函数 - 因此,如果您此时需要重新初始化 BackgroundWorker,您需要将初始化代码移动到可以在合适的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多