2

RestSharpの実装で次の問題が発生します。ExecuteAsync()続行する前に、アプリケーションからの応答を待機させるにはどうすればよいですか?

私はさまざまな解決策を試しました:

最初に(メソッドはExecuteAsync応答を待機しません):

public Task<Connection> Connect(string userId, string password)
    {
        var client = new RestClient(_baseUrl)
            {
                Authenticator = new SimpleAuthenticator("user", userId,
                    "password", password)
            };
        var tcs = new TaskCompletionSource<Connection>();
        var request = new RestRequest(AppResources.Authenticating);
        client.ExecuteAsync<Connection>(request, response =>
            {
                tcs.SetResult(new JsonDeserializer().
                     Deserialize<Connection>(response));
            });
        return tcs.Task;
    }   

だから私はこれを試しましたが、アプリケーションがフリーズします:

   public Task<Connection> Connect(string userId, string password)
    {
        EventWaitHandle executedCallBack = new AutoResetEvent(false);
        var client = new RestClient(_baseUrl)
            {
                Authenticator = new SimpleAuthenticator("user", userId, 
                     "password", password)
            };
        var tcs = new TaskCompletionSource<Connection>();
        var request = new RestRequest(AppResources.Authenticating);
        client.ExecuteAsync<Connection>(request, response =>
            {
                tcs.SetResult(new JsonDeserializer().
                          Deserialize<Connection>(response));
                executedCallBack.Set();
                });
        executedCallBack.WaitOne();
        return tcs.Task;
    }   
4

1 に答える 1

4

Taskのポイントとasync/awaitパターンが欠けていると思います。

このメソッド内で待機することはありませんが、を返すため、必要Task<>に応じて、呼び出し元が非同期で待機できるようになります。

発信者は次のようになります。

 public async void ButtonClick(object sender, RoutedEventArgs args)
 {
     Connection result = await restClient.Connect(this.UserId.Text, this.Password.Text);

      //... do something with result
 }

コンパイラーは、このコードを作成する方法を知っています。これは、同期(ブロッキング)と非常によく似ており、非同期コードに変換します。

asyncawaitキーワードに注意してください。そして、Task<Connection>がになっていることに注意してConnectionください。

それを考えると、最初のコードスニペットは問題ないように見えます。

2つ目は、別のスレッドメカニズム(つまり、セマフォAutoResetEvent)を導入しているため、問題が発生する可能性があります。さらに、@ HaspEmulatorは正しいです-これがUIスレッド上にある場合、これはWPアプリをデッドロックすることが知られています。

于 2013-03-15T20:31:31.520 に答える