2012-05-14 67 views
1

回調是否應該在不同的線程上調用? 使用此代碼:不同線程上的回覆回調

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

我得到一個「InvalidOperationException異常」:「因爲不同的線程擁有它調用線程不能訪問該對象」

不應該在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對象。在WPF的情況下,你可以使用Dispatcher

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

在一般的情況下看到syncronization context

+1

我知道,但不應該回調UI線程上調用?是不是在另一個線程上的實際進程,然後在UI線程上通知調用者? – Matthew

+0

查看我的更新。回調在請求所在的同一線程上調用。 – undefined

+0

謝謝,但這是一個關於爲什麼RestSharp團隊以這種方式工作的問題。例如:如果我要使用BackgroundWorker,則DoWork位於新線程上,但ReportProgress位於UI上。爲什麼這兩個實現(RestSharp和BackgroundWorker)有所不同?或者更多,回調的標準是什麼? – Matthew