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();
}

谢谢大家。

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

两件事:

首先,您试图从后台工作人员访问UI:

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

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

其次,您调用ExecuteAsync这一事实正是您的后台工作人员立即完成,但文件仍在继续上传的原因。您基本上是在排队等待rest客户端异步执行大量工作。

您最初在什么时候使用ExecuteAsync?你已经在后台线程中了——为什么不同步地完成工作呢?