multithreading - 不同线程上的响应回调

标签 multithreading callback restsharp

回调应该在不同的线程上调用吗? 使用此代码:

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

我收到“InvalidOperationException”:

"The calling thread cannot access this object because a different thread owns it."

回调不应该在 UI 线程上吗?还是我错了?

最佳答案

实际上,如果你查看源代码,你就会发现

    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

关于multithreading - 不同线程上的响应回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10580013/

相关文章:

ios - 异步加载uitableview中的照片

mysql - MySQL复制实际上如何工作? (关于线程)

javascript - 处理回调函数

ruby-on-rails - MultiJson::DecodeError {"email"处的意外标记 :"foo@bar.com"}

c# - RestSharp 简单完整示例

c# - 在 RestSharp 中获取 REST 请求的原始 JSON 数据

c++ - 没有互斥锁的事件通知

c++ - 如何复制构造一个带有指向浮点 block 的指针的 std::vector 并将其传递给线程?

javascript - if 语句引发回调

c# - 在 RestSharp 中优雅地处理一个空的 json 对象