2012-03-24 17 views
1

バックグラウンドワーカーに多くの問題があります。私は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(); 
} 

はあなたのすべてをありがとうございました。

+1

ExecuteAsync()を使用している限り、BackgroundWorkerは使用できません。代わりにExecute()を使用して、実際にキャンセルすることができます。 –

答えて

3

2つのこと:まず

、あなたは、バックグラウンドワーカーからUIにアクセスしようとしている:

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

あなたはそれを行うべきではありません。バックグラウンドワーカーが最初に必要とするすべての情報を設定する必要があるように聞こえます。次に開始します。

第2に、ExecuteAsyncと呼んでいるという事実は、あなたのバックグラウンドワーカーがすぐに完了しているにもかかわらず、ファイルがアップロードされ続ける理由です。基本的には、残りのクライアントが非同期で処理するための作業負荷をキューに入れています。

最初にExecuteAsyncを使用していますか?あなたはすでにバックグラウンドスレッド内にいます。なぜ、同期をとるだけではないのですか?

+0

「Execute」がブロックされ、MID UPLOADのアップロードを終了できないことは私の知るところでした。だから、これは単純に 'Execute'を使って可能であると言っていますか? – Anteara

+0

+1私が心から欲しかった答え – GETah

+0

@Anteara:あなたはおそらく中間アップロードをやめることはできませんが、現時点であなたがやっているやり方は、基本的にはすべての*アップロードを開始しようとしています。とにかくそれをキャンセルする方法はありません。少なくとも、各リクエストを同期させると、適切なタイミングで停止することができます。私は 'RestClient'の解約戦略を知るのに十分なことは分かっていませんが、私は"バックグラウンドで同期的に "少なくともあなたの現在のアプローチよりも良いと言います。 –

関連する問題