【发布时间】: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