2

このメソッドを呼び出すと、何も起こらず、アプリケーションがクラッシュします。メソッドによるものだと思いExecuteAsyncます。誰かが私を助けてくれますか?これが私のコードです。

CODE1

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

私もこのコードを試しましたが、それでも同じ問題が存在します。

CODE2

public async 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)));
        Debug.WriteLine(tcs.Task.Result.Data);
        return await tcs.Task;
    }   
4

1 に答える 1

2

Task.ResultまたはTask.Wait非同期コードで使用したくない。Taskこれらのメンバーは、タスク並列ライブラリ(並列コードの記述)の一部として使用する場合にのみ使用されます。非同期コードで使用することはほとんどありません。

あなたの場合、あなたが戻ってきた人(またはおそらくコールスタックのさらに上)に電話をかけResultているのではないかと思います。私のブログで説明しているように、これはデッドロックを引き起こす可能性があります。TaskConnect

初心者向けの非同期コードに関しては、@LasseVKarlsenに同意しません。async新しい/await言語機能がリリースされた今、それは絶対に学ぶべきことだと思います。

私の紹介から始めて、 MSDNドキュメントTAPパターンをフォローアップすることをお勧めします。次に、最も一般的な落とし穴を回避するために、私のベストプラクティスの記事を確認してください。

于 2013-03-15T11:55:14.997 に答える