Multithreading 不同线程上的响应回调

Multithreading 不同线程上的响应回调,multithreading,callback,restsharp,Multithreading,Callback,Restsharp,回调应该在不同的线程上调用吗? 使用此代码: client.ExecuteAsync<List<IngredientDto>>(request, Response => { textBox1.Text += Response.Data.Count; }); client.ExecuteAsync(请求,响应=> { textBox1.Text+=Response.Data.Count; }); 我得到一个“无效操作异常”: “调用

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

client.ExecuteAsync<List<IngredientDto>>(request, Response =>
    {
        textBox1.Text += Response.Data.Count;
    });
client.ExecuteAsync(请求,响应=>
{
textBox1.Text+=Response.Data.Count;
});
我得到一个“无效操作异常”:

“调用线程无法访问此对象,因为其他线程拥有它。”


回调不应该在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线程上通知调用方吗?请参阅我的更新。回调是在请求所在的同一个线程上调用的。谢谢,但这是一个关于RestSharp团队为何以这种方式工作的问题。例如:如果我要使用BackgroundWorker,则DoWork在新线程上,而ReportProgress在UI上。为什么这两种实现(RestSharp和BackgroundWorker)有区别?还有,回调的标准是什么?在.net中,异步操作有两种常见模式:异步编程模型(它出现在委托、IO、旧样式WebRequst中)在该模型中,回调在线程池中的某个线程中被调用。这是著名的模型。中较新的一个在BackgroundWorker、WebClient和其他少数几个类中实现(称为EAP,或类似的,不记得确切的名称)。在此模型中,回调在调用线程中执行。因此,RestSharp使用EAP模型,但提供了作为APM的实现。设计缺陷:)
client.ExecuteAsync<List<IngredientDto>>(request, Response =>
    {
        Dispatcher.Invoke((Action)() => {textBox1.Text += Response.Data.Count;});
    });