【解決方法】なぜ "待つ" 待っていませんか?

プログラミングQA

[ad_1]

RunTest() メソッドを呼び出してテストを実行しています。
私は期待しています、それは印刷されるはずです..
「AsyncAndAwait を開始しています…」
「別のことをしている…」
そして、しばらく待つ必要があります..そして、「完了しました!!!」と出力するはずです。

しかし、それはそうではありません..実際の結果は.
「AsyncAndAwait を開始しています…」
しばらくお待ちください
「別のことをしている…」
“出来ました!!!”

それがどのように機能するかを理解するのを手伝ってください。

これがコードサンプルです。

C#
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]

コメント

タイトルとURLをコピーしました