.NET面接の準備(2つ)非同期で待機

1.実行プロセス
概念
  • これは、c#言語レベルのシンタックスシュガーに属し、ILレベルでの新しい命令を含まず、同期コンテキストを使用して並列処理を実現します。
  1. await操作が実行されると、現在のスレッドがスレッドプールに解放され、操作が完了するのを待ちます。スレッドのコンテキストが保存されます。
  2. 操作が完了すると、スレッドプールはランダムにスレッドを取り出して実行を続行します
第二に、役割
  1. 非同期非同期ネットワーク処理には最も明らかな効果があります。呼び出された非同期メソッドで多くの時間のかかる計算が行われる場合、非同期は効果がありません(awaitは操作が完了するのを待つだけだからです)。
  2. asyncは新しいスレッドを開始しません。非同期実行プロセスと同期実行プロセスは同じであり、実行時間も同じです。リクエストの実行回数を非同期的に増やします。Task.Run()で非同期を使用する必要があります
  3. 非同期の本質:待機中のスレッド回復と完了後のスレッド切り替え
3、デッドロック

理由:
jsonTask.Result.ToString()をポイントすると、デッドロックが発生します。
理由:非同期メソッドGetJsonAsync()を呼び出すときにGetメソッドのメインスレッドaが待機に遭遇し、GetStringAsync()メソッドがスレッドbを開始して実行を終了します。スレッドaで待機した後、コードを実行する必要がありますが、スレッドaはjsonTask.ResultBlockingによってアクセスされ、2つのブロックが互いに待機し、デッドロックを形成します。

解決策:
メソッドを常に非同期状態に保ちます。つまり、新しいスレッドが非同期メソッドの戻り結果を待機できるようにします。
ここに画像の説明を挿入
このスキームにはエラーが発生することがあります。非同期メソッドGetJsonAsync()が呼び出されると、以下に示すように、awaitは使用されません。

public string Get()
{
    
    
    string jsonResultString = string.Empty;

    Task.Run(async () =>
    {
    
    
        jsonResultString = GetJsonAsync(...);
     //await之后的代码
    }).Wait();//此处启动线程是为了防止Async & Await模式造成死锁
	doingSomething();
    return await jsonResultString;
}

理由:非同期メソッドが呼び出された直後にawaitが使用されず、実行が続行されると、現在のスレッドのコンテキスト情報が保存されません。非同期タスクが完了すると、スレッドプールはランダムにスレッドを取り出して実行を続行します。 、実行はその時点で呼び出しを読み取ります。元のスレッドのコンテキスト情報。コンテキスト情報は保存されないため、null例外が報告されます。

おすすめ

転載: blog.csdn.net/hhhhhhenrik/article/details/91896053