2012-05-14 3 views
1

Предполагается ли, что обратный вызов вызывается в другом потоке? Используя этот код:Ответный ответ на другую тему

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

я получаю «InvalidOperationException»:

«Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет.»

Не должен ли обратный вызов быть в потоке пользовательского интерфейса, или я не прав?

ответ

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

Я знаю, но не должен быть обратный вызов называется в потоке пользовательского интерфейса? Не является ли процесс в другом потоке, а затем уведомляет вызывающего абонента о потоке пользовательского интерфейса? – Matthew

+0

Смотрите мое обновление. Обратный вызов вызывается в том же потоке, который запрашивается. – undefined

+0

Спасибо, но это вопрос о том, почему команда RestSharp работала именно так. Например: если бы я использовал BackgroundWorker, DoWork находится в новом потоке, но ReportProgress находится в пользовательском интерфейсе. Почему существует разница в этих двух реализациях (RestSharp и BackgroundWorker)? Или больше, каков стандарт для обратных вызовов? – Matthew

Смежные вопросы