2017-03-08 18 views
1

私は、現在同期しているasync/awaitにかなり大きなコードをASP.NETで移行しようとしています。私が見てきたほとんどの勧告は、スタック全体をマイグレーションすると言います。基本的にすべての変更を一度に行うことができるショットガンのアプローチです。ASP.NETコードの同期から非同期/待機への部分的な移行

危険を減らすために、コードの変更の範囲を一度に制限したいと思いますが、コードの重複を避けるために同期メソッドから非同期コードを呼び出す必要があります。

私はいくつかの検索を行い、このタイプの非同期コードのラッピングを可能にするAsyncContext.Runメソッドを持つStephen ClearyのNito.AsyncEx NuGetパッケージを見つけました。

以下は、移行を実行する方法のサンプルです。レガシーコードはGetContentを呼び出します。これは同期型で、GetContentAsyncメソッドの単なるラッパーです。これにより、同期メソッドを従来のコードから呼び出す柔軟性が得られます。私は変更する準備はできていませんが、同時に私が選択した場所で非同期コードを使用できるようにします。

私の質問は、実行可能なアプローチのようですか?同期ラッパーメソッドに欠点や潜在的なパフォーマンス問題がありますか?大規模なコードベースを非同期に移行する際の課題は、他の人たちがどのように取り組んできましたか?

using Nito.AsyncEx; 
using System.Net.Http; 
using System.Threading.Tasks; 

namespace AsyncMigration 
{ 
    public class ContentManager 
    { 
     public string GetContent(string url) 
     { 
      return AsyncContext.Run(() => GetContentAsync(url)); 
     } 

     public async Task<string> GetContentAsync(string url) 
     { 
      HttpClient client = new HttpClient(); 
      return await client.GetStringAsync(url); 
     } 
    } 
} 

答えて

0

どのようなAsyncContextは、すべての呼び出しをキューに入れて順次実行することです。本質的に。

AsyncContextは、現在のスレッドをブロックしながら、非同期コードを実行するために余分なスレッドを使用するため、パフォーマンスがさらに低下します。呼び出されたとき。同期メソッドは、Webサーバーのスレッドプールからスレッドを取得します。この同期メソッドはAsyncContext.Runでブロックされ、新しいスレッドを処理するためにスレッドを使用できなくなります。次に、AsyncContextはスレッドプールから別のスレッドを取得してジョブを完了させます。

つまり、AsyncContextを使用すると、純粋な同期呼び出しのみを使用する場合よりもスレッドを2倍にすることができます。

関連する問題