3

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

我是异步/等待的新手。下面的代码示例中描述了我的问题。为什么没有调用突出显示的行?

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 回答
-1

您不应该将其称为“AsyncMethod”,因为它没有异步元素。

该方法使用将在与当前线程不同的线程中运行的任务。

于 2013-08-06T07:14:17.337 回答