对.NET 4异步的困惑

rhu*_*hes 3 c# asynchronous .net-4.0 async-await

我使用Microsoft.Bcl.Async nuget包来使用Async/Await(我的目标是.NET 4,而不是4.5)

我是Async/Await的新手.我的问题在以下代码示例中描述.为什么没有调用突出显示的行?

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);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

这条线:

Console.WriteLine("And the value is... {0}", val);
Run Code Online (Sandbox Code Playgroud)

被(由编译器)转换为延续 ; 只有在"等待"的任务完成时才会调用它(使用值等).问题是:你创建了一个任务,但是你还没有启动它:所以它永远不会完成.

如果您开始在底部创建的任务,它将最终完成.此外,通常你会放在"做"的工作里面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;
    }
Run Code Online (Sandbox Code Playgroud)

还要注意的是Got the value被打印出来之前很久And the value is...-那是因为连续发生在一个工作线程 ; 该Run方法首先将控制权返回给调用者(Main)await.

  • 你没有使用`Task.Factory.StartNew`或`Run`的原因? (2认同)