backgroundWorker завершает работу сразу после запуска, плюс продолжается после отмены - PullRequest
1 голос
/ 24 марта 2012

У меня много проблем с моим второстепенным работником.У меня есть фоновый работник для загрузки фотографий (иногда более 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, так что он может постоянно проверять, является ли отменаpend true.Если это так, задайте для e.Cancel значение true, чтобы завершить поток.
Кроме того, я использую ExecuteAsync для загрузки, поэтому я надеялся, что смогу завершить поток во время загрузки, чтобы фотография не загружалась,

Хорошо, извините, я знаю, что это обсуждалось ранее.Я просто не могу понять, что я делаю неправильно, хотя.
Кстати, вот как я пытаюсь отменить:

public void stopButton_Click(object sender, EventArgs e)
{
    doneBox.Items.Add("You pressed the stop button.");
        backgroundWorker1.CancelAsync();
}

Спасибо всем.

1 Ответ

3 голосов
/ 24 марта 2012

Две вещи:

Во-первых, вы пытаетесь получить доступ к пользовательскому интерфейсу из фонового рабочего:

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

Вы не должны этого делать.Звучит так, как будто вы должны сначала настроить всю информацию, которая нужна фоновому работнику, , а затем , запуская ее.

Во-вторых, тот факт, что вы звоните ExecuteAsync, и является причиной вашего фонаработник завершает работу немедленно, но затем файлы продолжают загружаться.В основном вы ставите в очередь большую часть работы для асинхронного выполнения остального клиента.

В то время как вы используете ExecuteAsync в первую очередь?Вы уже в фоновом потоке - почему бы просто не выполнить работу синхронно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...