我的背景工作者遇到了很多麻烦。我有一个后台工作人员将图片(有时超过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语句在那里,所以它可以不断检查取消是否为真。如果是,则将e.Cancel设置为true以结束该线程
此外,我正在使用ExecuteAsync上传,所以我希望我能够终止上传中的线程,以便照片不上传。
好的,对不起,我知道之前已经讨论过了。我只是无法弄清楚我做错了什么。
顺便说一句,这是我尝试取消的方式:
public void stopButton_Click(object sender, EventArgs e)
{
doneBox.Items.Add("You pressed the stop button.");
backgroundWorker1.CancelAsync();
}
谢谢大家。
答案 0 :(得分:3)
两件事:
首先,您尝试从后台工作者访问UI:
request.AddParameter("email", usernameBox.Text);
你不应该这样做。听起来你应该首先设置后台工作人员需要的所有信息,然后启动它。
其次,您正在调用ExecuteAsync
的事实正是您的后台工作人员立即完成的原因,但随后文件将继续上传。你基本上是为了让其他客户端为异步进行排队工作。
你是在第一时间使用ExecuteAsync
吗?你已经在后台线程中 - 为什么不同步进行工作呢?