[ad_1]
RunTest() メソッドを呼び出してテストを実行しています。
私は期待しています、それは印刷されるはずです..
「AsyncAndAwait を開始しています…」
「別のことをしている…」
そして、しばらく待つ必要があります..そして、「完了しました!!!」と出力するはずです。
しかし、それはそうではありません..実際の結果は.
「AsyncAndAwait を開始しています…」
しばらくお待ちください
「別のことをしている…」
“出来ました!!!”
それがどのように機能するかを理解するのを手伝ってください。
これがコードサンプルです。
async Task<List<int>> Counting() { List<int> nums = new List<int>(); for (int i = 0; i < 100; i++) { Thread.Sleep(100); nums.Add(i); } return nums; } public async void AsyncAndAwait() { Console.WriteLine("AsyncAndAwait starting..."); var task = Counting(); Console.WriteLine("Doing something else..."); var list = await task; Console.WriteLine("I am done!!!"); } public void RunTest() { AsyncAndAwait(); }
解決策 1
解決策 2
以下は、あなたの条件を満たすために書くべきコードです:
async Task<List<int>> Counting() { Console.WriteLine("....something else...Started"); List<int> nums = new List<int>(); for (int i = 0; i < 100; i++) { // Thread.Sleep(100); await Task.Delay(100); nums.Add(i); } Console.WriteLine(".....something else...Done"); return nums; } public async void AsyncAndAwait() { Console.WriteLine("AsyncAndAwait starting..."); Task<List<int>> task = Counting(); Console.WriteLine("Doing something else..."); List<int> list = task.Result; Console.WriteLine("I am done!!!"); } public void RunTest() { AsyncAndAwait(); }
あなたのコードが望ましい動作をしていない理由はいくつかわかります。
1.メソッド宣言時にasyncを入れるだけでは非同期メソッドにはなりません。 その中で待っている必要があります。 で述べたように MSDN ページ : “async キーワードが変更するメソッドに await 式またはステートメントが含まれていない場合、メソッドは同期的に実行されます。” そのため、「Thread.Sleep(100)」の代わりに「await Task.Delay(100)」を使用しました。
2. 「var task = Counting()」と書くだけで、同じスレッドで「Counting」メソッドを呼び出すことになります。 await キーワードを使用しない場合、それはブロッキング コールです。 で述べたように MSDN ページ : “await 式は、実行中のスレッドをブロックしません。” 詳細については、次をご覧ください。
http://stackoverflow.com/questions/23022573/calling-async-methods-from-a-synchronous-context[^]
それが役立つことを願っています。 ありがとう。
[ad_2]
コメント