backgroundWorker在启动后立即退出,并且在取消后继续
本文关键字:继续 取消后 启动 backgroundWorker 退出 | 更新日期: 2023-09-27 18:29:04
我的后台工作人员遇到了很多麻烦。我有一个后台工作人员上传图片(有时超过100张)到tumblr。当然,这是极其重复的
我的问题是:
1) 在我启动线程后不久或几秒钟,就会调用backgroundWorker1_RunWorkerCompleted
,如它在该方法/事件中打印文本所示。
2) 当我取消线程时,它会调用backgroundWorker1_RunWorkerCompleted
,正如它打印其中的文本所示,然而,文件会继续上传。这条线似乎仍然存在。
我不知道自己做错了什么,过去几天我一直在寻找,尝试了很多不同的方法。这是我的代码:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundWorker = sender as BackgroundWorker;
var restClient = new RestClient("http://tumblr.com/api/write");
foreach (string item in queueBox.Items)
{
if (!backgroundWorker.CancellationPending)
{
var request = new RestRequest(Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddParameter("email", usernameBox.Text);
request.AddParameter("password", passwordBox.Text);
request.AddParameter("type", "photo");
byte[] byteArray = File.ReadAllBytes(FolderName + "''" + item);
request.AddFile("data", byteArray, FolderName + "''" + item);
var newItemToAvoidClosure = item;
restClient.ExecuteAsync(request, response => { doneBox.Invoke(new UpdateTextCallback(this.UpdateText), new object[] { newItemToAvoidClosure }); });
}
else
{
e.Cancel = true;
}
}
}
这是我的RunWorkerCompleted
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!(e.Cancelled))
{ //if not cancelled
if (!(e.Error == null))
{ //if above true, see if theres an error
doneBox.Items.Add("'r'nAn Error Ocurred: " + e.Error.Message + "'r'n. However, what you uploaded may have been successful up until this error." );
}
else
{ //else there is no error which means it was 100% successful
doneBox.Items.Add("Finished uploading! Go and check out your stuff on Tumblr! ^_^" );
}
}
else //else the user DID press cancel
{
doneBox.Items.Add("You pressed Cancel - However, the photos before you pressed cancel have been uploaded." );
}
}
现在,我将尝试解释我认为DoWork
中发生了什么,
由于for循环是每次上传照片的循环,所以if语句就在其中,因此它可以不断检查cancellpending是否为true。如果是,请将e.Cancel设置为true以结束线程
此外,我正在使用ExecuteAsync进行上传,所以我希望能够在上传过程中终止线程,这样照片就不会上传了。
好的,很抱歉,我知道这个问题以前已经讨论过了。我就是搞不明白我做错了什么。
顺便说一句,这就是我试图取消的方式:
public void stopButton_Click(object sender, EventArgs e)
{
doneBox.Items.Add("You pressed the stop button.");
backgroundWorker1.CancelAsync();
}
谢谢大家。
两件事:
首先,您试图从后台工作人员访问UI:
request.AddParameter("email", usernameBox.Text);
你不应该那样做。听起来你应该先设置后台工作人员需要的所有信息,然后启动它。
其次,您调用ExecuteAsync
这一事实正是您的后台工作人员立即完成,但文件仍在继续上传的原因。您基本上是在排队等待rest客户端异步执行大量工作。
您最初在什么时候使用ExecuteAsync
?你已经在后台线程中了——为什么不同步地完成工作呢?