私はそれらは基本的に同じものだと思っていました—プロセッサー間でタスクを分割するプログラムを書く(2つ以上のプロセッサーを持つマシン上で)。それから私はこれを読んでいます、それは言う:
非同期メソッドは、非ブロッキング操作を目的としています。非同期メソッドのawait式は、待機中のタスクの実行中に現在のスレッドをブロックしません。代わりに、式は継続としてメソッドの残りの部分にサインアップし、asyncメソッドの呼び出し元に制御を返します。
asyncおよびawaitキーワードを使用しても、追加のスレッドが作成されることはありません。非同期メソッドは独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。メソッドは現在の同期コンテキストで実行され、メソッドがアクティブな場合にのみスレッドで時間を使用します。Task.Runを使用してCPUにバインドされた作業をバックグラウンドスレッドに移動できますが、バックグラウンドスレッドは、結果が利用可能になるのを待っているだけのプロセスには役立ちません。
そして、誰かがそれを英語に翻訳できるかどうか疑問に思っています。これは、非同期性(つまり、単語ですか?)とスレッド化を区別しているようで、非同期タスクはあるがマルチスレッド化はできないプログラムを作成できることを示しています。
これで、pgの例のような非同期タスクの考え方がわかりました。ジョンスキートのC#の詳細、第3版の467
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
async
キーワードの手段が、「この機能は、それが呼ばれるたびに、そのコールが呼ばれるようにした後、その完了がすべてのために必要とされるコンテキストで呼び出されることはありません。」
つまり、あるタスクの途中でそれを書く
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
以来、DisplayWebsiteLength()
とは何の関係も持っていないx
かをy
、原因となりますDisplayWebsiteLength()
ように、「バックグラウンドで」実行されます
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
明らかにそれは愚かな例ですが、私は正しいのですか、それとも完全に混乱していますか?
(また、私は理由について困惑しているsender
とe
、これまで以上の関数の本体では使用されません。)
sender
そしてe
ほとんど唯一の場所-これは実際にイベントハンドラで示唆されているasync void
ことが望ましいです。ほとんどの場合、これはボタンのクリックなどで呼び出されます。その結果、このアクションはアプリケーションの残りの部分に対して完全に非同期で発生します。しかし、それはすべて1つのスレッド、つまりUIスレッド(UICPスレッドにコールバックをポストするIOCPスレッドのごくわずかな時間)にあります。
DisplayWebsiteLength
コードサンプルに関する非常に重要な注意:ステートメントでは使用HttpClient
しないでusing
ください-負荷が大きい場合、コードは使用可能なソケットの数を使い果たし、SocketExceptionエラーが発生する可能性があります。不適切なインスタンス化に関する詳細情報。