3

Microsoft.Bcl.Async nuget パッケージを使用して Async/Await を使用しています (私のターゲットは 4.5 ではなく .NET 4 です)

私は非同期/待機が初めてです。私の問題は、次のコード サンプルで説明されています。強調表示された行が呼び出されないのはなぜですか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AsyncTest
{
class Program
{
    static void Main(string[] args)
    {
        Run();

        Console.WriteLine("Got the value");

        Console.ReadKey();
    }

    public static async void Run()
    {
        Console.WriteLine("Testing Async...");

        var val = await AsyncMethod();

        // HIGHLIGHTED LINE. WHY IS THIS LINE NOT CALLED?
        Console.WriteLine("And the value is... {0}", val);
    }

    public static Task<long> AsyncMethod()
    {
        long myVal = 1;

        for (long l = 0; l < 100000; l++)
        {
            myVal++;
            Console.WriteLine("l = {0}", l);
        }

        return new Task<long>(() => myVal);
    }
}
}
4

2 に答える 2

5

この線:

Console.WriteLine("And the value is... {0}", val);

(コンパイラによって)継続に変換されます。「待機中」のタスクが完了したときにのみ(値などで)呼び出されます。問題は、タスクを作成しましたが、まだ開始していないため、完了することはありません。

一番下で作成したタスクを開始すると、最終的に完了します。また、通常、「実行中」の作業は、外側ではなく内側に配置します。Task

    public static Task<long> AsyncMethod()
    {
        var task = new Task<long>(() =>
        {
            long myVal = 1;

            for (long l = 0; l < 100000; l++)
            {
                myVal++;
                Console.WriteLine("l = {0}", l);
            }
            return myVal;
        });
        task.Start();
        return task;
    }

また、継続がワーカー スレッドで発生するため、-のずっと前にGot the value出力されることに注意してください。このメソッドは、最初に呼び出し元 () に制御を返します。And the value is...RunMainawait

于 2013-02-07T12:57:03.837 に答える