backgroundWorker在启动后立即退出,并在取消后继续

时间:2012-03-24 12:48:17

标签: c# asynchronous upload backgroundworker terminate

我的背景工作者遇到了很多麻烦。我有一个后台工作人员将图片(有时超过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();
}

谢谢大家。

1 个答案:

答案 0 :(得分:3)

两件事:

首先,您尝试从后台工作者访问UI:

request.AddParameter("email", usernameBox.Text);

你不应该这样做。听起来你应该首先设置后台工作人员需要的所有信息,然后启动它。

其次,您正在调用ExecuteAsync的事实正是您的后台工作人员立即完成的原因,但随后文件将继续上传。你基本上是为了让其他客户端为异步进行排队工作。

你是在第一时间使用ExecuteAsync吗?你已经在后台线程中 - 为什么不同步进行工作呢?