2012-05-14 10 views
1

コールバックは別のスレッドで呼び出されるはずですか? このコード使用:私は「InvalidOperationExceptionが」取得異なるスレッドの応答コールバック

client.ExecuteAsync<List<IngredientDto>>(request, Response => 
    { 
     textBox1.Text += Response.Data.Count; 
    }); 

を:

は「別のスレッドがそれを所有しているので、呼び出し元のスレッドがこのオブジェクトにアクセスすることはできません。」

コールバックはUIスレッド上にあってはいけませんか、間違っていますか?あなたがソースコードを見れば

答えて

1

実際には、あなたがにつながる

public virtual RestRequestAsyncHandle ExecuteAsync<T>(IRestRequest request, Action<IRestResponse<T>, RestRequestAsyncHandle> callback) 
    { 
     return ExecuteAsync(request, (response, asyncHandle) => 
     { 
      IRestResponse<T> restResponse = response as RestResponse<T>; 
      if (response.ResponseStatus != ResponseStatus.Aborted) 
      { 
       restResponse = Deserialize<T>(request, response); 
      } 

      callback(restResponse, asyncHandle);//<--- this means that response & callback are executed at **same** thread. 
     }); 
    } 

が表示されます: あなたは非UIスレッドからUIオブジェクトを更新することはできません。私が知っているsyncronization context

+1

を参照してくださいWPFの場合、あなたは一般的なケースではDispatcher

client.ExecuteAsync<List<IngredientDto>>(request, Response => { Dispatcher.Invoke((Action)() => {textBox1.Text += Response.Data.Count;}); }); 

を使用できますが、コールバックはUIスレッドで呼び出されるべきではないのですか?実際のプロセスが別のスレッドではないのですか?UIスレッドで呼び出し元に通知しますか? – Matthew

+0

私の更新を見てください。コールバックは、要求と同じスレッドで呼び出されます。 – undefined

+0

ありがとうございますが、これはRestSharpチームがこのように働いた理由に関する質問です。たとえば、BackgroundWorkerを使用する場合、DoWorkは新しいスレッドにありますが、ReportProgressはUI上にあります。なぜこれらの2つの実装(RestSharpとBackgroundWorker)に違いがありますか?それ以上は、コールバックの標準は何ですか? – Matthew

関連する問題