バックグラウンドワーカーに多くの問題があります。私はtumblrに写真をアップロードするバックグラウンドワーカー(時には100以上)を持っています。もちろん、これは非常に繰り返しです。そのメソッド/イベント内のテキストを印刷することによって示されるように
1)とすぐにまたは私は私のスレッドを開始した後、数秒、backgroundWorker1_RunWorkerCompleted
が、呼び出されます。
私の問題は、このです。
2)スレッドをキャンセルすると、その中にテキストを表示するようにbackgroundWorker1_RunWorkerCompleted
が呼び出されますが、ファイルは引き続きアップロードされます。スレッドがまだ存在するようです。
私は何が間違っているのか分かりません。私は過去数日を探していて、非常に多くの方法を試しました。ここに私のコードは次のとおりです。
backgroundWorkerは、開始するとすぐに終了し、キャンセル後に続行します。
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
で何が起こっているのかと思い試してみて、説明しますloopは各写真のアップロードをループするもので、if文がそこにあるので、cancellationpendingがtrueであるかどうかを常に確認できます。そうであれば、e.Cancelをtrueに設定してスレッドを終了します。
また、私はExecuteAsyncを使用してアップロードしていますので、アップロード中のスレッドを終了することができますので、写真はアップロードされません。
さて、申し訳ありませんが、これはこれまでに議論されていることがわかりました。私は何が間違っているのか分かりません。ところで
が、これは私がキャンセルしようとする方法です:
public void stopButton_Click(object sender, EventArgs e)
{
doneBox.Items.Add("You pressed the stop button.");
backgroundWorker1.CancelAsync();
}
はあなたのすべてをありがとうございました。
ExecuteAsync()を使用している限り、BackgroundWorkerは使用できません。代わりにExecute()を使用して、実際にキャンセルすることができます。 –