2

コールバックは別のスレッドで呼び出されることになっていますか?このコードの使用:

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

「InvalidOperationException」が発生します:

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

コールバックはUIスレッドにあるべきではありませんか、それとも私は間違っていますか?

4

1 に答える 1

2

実際、ソースコードを見ると、

    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;});
    });

一般的なケースでは、同期のコンテキストを参照してください

于 2012-05-14T08:46:38.060 に答える