たとえば、fooCPU
が同期的に実行される(I/Oを実行する純粋な非同期メソッドを呼び出すのではなく、Task.Run
または同様の方法でコードを実行するために他のスレッドを使用しない)。このメソッドは重い計算を実行します - それはCPUに束縛されています。UIスレッドの特色は何ですか?
今私は、ワーカースレッドによって実行されることを委任せずに、私のプログラムでfooCPU
を呼び出します。 fooCPU
の1行が実行に時間がかかる場合、終了するまで他の行は実行されません。たとえば、UIスレッドから呼び出すと、UIスレッドがフリーズします(GUIは応答しなくなります)。
async/await
がmutlithreadingの模倣品であると述べました。 2つの異なるコードの行は、1つのスレッド上で交互に実行されます。これらの行のいずれかが実行に時間がかかる場合、終了するまで他の行は実行されません。
私は、UIスレッドで使用される非同期には当てはまると言われましたが、他のすべてのケース(ASP.NET、スレッドプール上の非同期、コンソールアプリケーションなど)では当てはまりません。
これは何を意味するのですか? UIスレッドはコンソールプログラムのメインスレッドとどのように異なるのですか?
私は誰もこのフォーラムの誰かがコメントなどに出てくるように、関連するトピックの議論を続けることを望んでいないと思いますので、新しい質問をすることをお勧めします。
winformアプリケーションとコンソールアプリケーションで同じコードをコンパイルし、ildasmやリフレクタを使ってコンパイルされたILの違いを確認します。 –
@OguzOzgulこれは多くの問題では役に立ちますが、このコードでは役に立ちません。コードはまったく同じです。どのような変更がグローバルな状態であるか - 同期コンテキストの存在。 – Luaan
答えはかなり良いですが、あなたの好奇心を満足させる唯一のことは、待っていることを詳しく理解することです。 ".net await internals"という検索はかなり良いようです。あなたが一時間を過ごすと、これはすべてに答えるでしょう、私は願っています。 – usr