【发布时间】:2018-03-18 13:27:06
【问题描述】:
我有两个关于 backgroundWorker 的问题:一个是取消,另一个是调用。
我的代码大致如下所示:
public partial class App : Form {
//Some codes omitted
public EditProcess Process = new EditProcess(ProcessTextBox);
private void ExecuteBtn_Click (object sender, EventArgs e) {
//DnldBgWorker is a backgroundWorker.
Download Dnld = new Download(dir, Process);
DnldBgWorker.DoWork += (obj, e) => GoDownload(Dnld, urllist, e);
DnldBgWorker.RunWorkerAsync();
DnldBgWorker.RunWorkerCompleted += (obj, e) => FinishExecution();
}
private void GoDownload(Download Dnld, string[] urllist, EventArgs e) {
foreach(string url in urllist) {
Dnld.Dnld(url);
}
for (int i = 0; i < 10; i++) {
System.Threading.Thread.Sleep(50);
if (DnldBgWorker.CancellationPending) {
e.Cancel = true;
return;
}
}
}
private void StopBtn_Click(object sender, EventArgs e) {
DnldBgWorker.CancelAsync();
}
}
public class Download {
// Some codes omitted
public WebClient client = new WebClient();
public EditProcess Process;
public Download(string dir, EditProcess Process) {
this.dir = dir;
this.Process = Process;
}
public void Dnld() {
client.DownloadFile(url, dir);
EditProcess.Text(String.Format("Downloaded: {0}\r\n"));
}
}
public class EditProcess {
public TextBox Box;
public EditProcess(TextBox Box) {
this.Box = Box;
}
public void Text(string textToAdd) {
Box.Text += textToAdd;
}
}
首先,当DnldBgWorker 正在运行时,我单击StopBtn 以停止DnldBgWorker,并且异步工作不会停止。我应该如何停止DnldBgWorker?
其次,EditProcess.Text(String.Format("Downloaded: {0}\r\n")); 会给我一个错误,即跨线程操作无效。我知道我应该派一个代表来做这件事,但我不知道具体怎么做。
++) 我的代码看起来以非常复杂的方式做着非常简单的工作,但我在这段代码中放入了非常重要的元素,所以请理解
【问题讨论】:
-
如果增加让线程休眠的时间会发生什么?而不是 50 尝试 1000。
标签: c# backgroundworker invoke cancellation