C# 5.0 では、async と await という 2 つのキーワードが導入されており、これにより非同期プログラミングの実装コードが大幅に簡素化され、TPL のタスクは async および await と優れた関係を持っています
private async void button1_Click(object sender, EventArgs e) { var length = AccessWebAsync(); // 这里可以做一些不依赖回复的操作 OtherWork(); this.textBox1.Text += String.Format("\n 回复的字节长度为: {0}.\r\n", await length); this.textBox2.Text = Thread.CurrentThread.ManagedThreadId.ToString(); } private async Task<long> AccessWebAsync() { MemoryStream content = new MemoryStream(); // 对MSDN发起一个Web请求 HttpWebRequest webRequest = WebRequest.Create("http://msdn.microsoft.com/zh-cn/") as HttpWebRequest; if (webRequest != null) { // 返回回复结果 using (WebResponse response = await webRequest.GetResponseAsync()) { using (Stream responseStream = response.GetResponseStream()) { await responseStream.CopyToAsync(content); } } } this.textBox3.Text = Thread.CurrentThread.ManagedThreadId.ToString(); return content.Length; } private void OtherWork() { this.textBox1.Text += "\r\n等待服务器回复中.................\n"; }
async は同期実行プログラムです、 await はフラグメントを分割して呼び出し元を一時停止する役割を果たしますが、マスターの分析によると、 await キーワードが出現するコードの前半部分とコードの後半部分です。は同期的に実行されます (つまり、呼び出し側スレッド、つまり GUI スレッドで実行されるため、コントロールへのクロススレッド アクセスの問題は発生しません)。 await のキー コード スニペットはスレッド プール スレッドで実行されます。 。
上記のコードでは、現在の UI スレッドをブロックしないように、FCL によってカプセル化された GetResponseAsync などのメソッドが呼び出されていますが、Await は新しいスレッドを作成しませんが、これに関する限り、実際に新しいスレッドが作成されます。 await 式 - - GetResponseAsync が行うことは、表面的な同期の錯覚を作り出すことです。以前に記事を書きました
C#asyncとawaitの非同期プログラミング学習メモ
awaitキーワードはTaskと密接に関係しており、その具体的な戻り値から、awaitとtaskのより深いContinuewith関数は同等であることがわかります。 async & await キーワードを使用して非同期実装を実現するには、FCL によってカプセル化された非同期メソッドを呼び出すか、タスク自体を呼び出して新しいスレッドを作成し、UI スレッドのタスクを共有して UI スレッドがブロックされるのを防ぎます。
以上がC# 5.0 では、async と await という 2 つのキーワードが導入されました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。