У меня много проблем с моим второстепенным работником.У меня есть фоновый работник для загрузки фотографий (иногда более 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();
}
Спасибо всем.