2016-11-24 6 views
1

のラムダ式に非同期の使用を避けることができる方法aController.Get()の署名が私はASPコントローラをテストするために私の現在のユニットテストコードでContinueWith()

public IHttpActionResult Get() 
である場合、私は

var resp = aController.Get(); 
string stringContent = await resp.ExecuteAsync(CancellationToken.None).Result.Content.ReadAsStringAsync(); 

を有します

今、私は私が私の上記のテストコードを変更

public async Task<IHttpActionResult> GetAsync() 

に取得()の署名を変更する必要があります:

aController.GetAsync().ContinueWith(
    async (t) => 
    { 
     var actionResult = t.Result; 
     string stringContent = await actionResult.ExecuteAsync(CancellationToken.None).Result.Content.ReadAsStringAsync(); 
}); 

ContinueWith()の使用中にラムダ式でasyncを持っていることをお勧めしている場合私の質問はあります。

これを実行する別の方法は、私はそれがいずれかの非常に読みやすいではないと思います

string stringContent = await aController.Get().Result.ExecuteAsync(CancellationToken.None).Result.Content.ReadAsStringAsync(); 

です。これを行うより良い方法があるのだろうかと思います。あなたはまだいくつかの同期呼び出しを行いたい場合は、私はそれから捨てると言うでしょう

var result = await aController.GetAsync(); 
var result2 = await result.ExecuteAsync(CancellationToken.None); 
string stringContent = await result2.Content.ReadAsStringAsync(); 

+0

個人的には、待っている2番目のバージョンが読みやすくなります。 – Midas

+0

これは実際に実行されますか?ブロッキングコールに気付く – Nkosi

答えて

1

2番目のオプションは、あなたがretrieved.Iは、3つの文でそれをやって示唆しているようにResultを強制ブロッキング呼び出しを持っています良いの非同期のアイデア。それはあなたが作っているものであり、価値のあるものを手に入れていない妥協であるからです。

+0

コードは良いですが、最後の段落はどういう意味ですか? –

+0

私の提案したコードは完全に非同期です。あなたが書いたコードは幾分ハーフシンク、半分の非同期なので、async/awaitやTask/ContinueWithを使用している場合は、非同期呼び出しをブロッキング呼び出しにするため、 ".Result"を呼び出さないでください。それに価値はない。 –

関連する問題