1

私はスレッド化、タスク、および非同期コーディングについて学んでおり、その概念を毎日取り組んでいる Web フォーム アプリケーションに適用しようとしています。

これまでのところ、私は持っています:

  • 次のように構成されたサービス参照:

サービス参照の構成

  • からのクライアント コールを変更しました

    MyServiceClient msc = new MyServiceClient();
    try
    {
         myData =  msc.GetData();                    
         msc.Close();
    }
    catch (Exception)
    {
         msc.Abort();
         throw;
    }
    

    MyServiceClient msc = new MyServiceClient();
    try
    {
         myData =  msc.GetDataAsync().Result;                    
         msc.Close();
    }
    catch (Exception)
    {
         msc.Abort();
         throw;
    }

結果を直接呼び出して、暗黙的にタスクで .Wait() を呼び出し、コードをほとんどそのままにします。

  1. これは、I/O の実行中にアプリ プール内のスレッドを他の作業のために解放するために正しいですか?
  2. 例外を別の方法で処理する必要がありますか?
  3. Close() と Abort() はまだ必要で関連性がありますか?
4

2 に答える 2

1

結果を直接呼び出して、暗黙的にタスクで .Wait() を呼び出し、コードをほとんどそのままにします。

これはまったくお勧めしません。一般的に、呼び出しResultやコードWait内でasyncデッドロックが発生する可能性があります(ブログで説明しています)。メソッドの実装方法が原因で (現在は) 機能する可能性がありsvcutilますが、このようなコードを書く練習を始めることはお勧めしません。

asyncコードベースを拡張できるようにする方がはるかに優れています。

MyServiceClient msc = new MyServiceClient();
try
{
     myData = await msc.GetDataAsync();                    
     msc.Close();
}
catch (Exception)
{
     msc.Abort();
     throw;
}
  1. これは、I/O の実行中にアプリ プール内のスレッドを他の作業のために解放するために正しいですか?

いいえ、あなたがしていることには本当に意味がありません。呼び出しをまったく非同期にすることはできません。

を使用するawaitと、非同期操作の利点が得られます (つまり、UI スレッドが解放されます)。

  1. 例外を別の方法で処理する必要がありますか?

を使用している場合await、いいえ、既存のコードは正常に機能します。を使用している場合Result、はい、すべての例外はAggregateException.

  1. Close() と Abort() はまだ必要で関連性がありますか?

はい。

于 2013-09-19T00:38:30.697 に答える
0

非同期バージョンを呼び出して完了を待つ方が通常の方法よりも優れている場合、フレームワークはこれを透過的に行うことができます。そうしないという事実は、このアプローチが良くないことを示しています。

await を使用する場合、スタックの各メソッドを async としてマークする必要がありますが、これははるかに手間がかかります。

それが取引です。IO の実行中にスレッドがスレッド プールに制御を返す必要があるため、コール スタック全体を変更する必要があります。スタック上のすべての関数を終了する必要があります。神に感謝します async/await により、これはほとんど機械的な演習になります。

そのため、他の方法では得られないパフォーマンスのニーズに応じて、async/await を使用する必要があります。デフォルトでは使用しないでください。まず、現時点で実際にスレッドが多すぎるかどうかを判断します。そうでない場合は、非同期がまったく必要ない可能性が非常に高くなります。他の場所に時間を投資してください。

于 2013-09-18T22:59:55.497 に答える