如何通过C#async/await将并发性添加到同步程序中

Xu *_*Guo 2 c# concurrency multithreading asynchronous async-await

我想学习如何为某些同步程序添加并发性,并以Fibonacci算法为例.我写了这些代码,但我发现它根本没有任何并发​​性.所有代码都在一个线程中运行,直到完成.任何人都可以向我解释为什么它不反映异步?

    async static Task<int> Fibonacci(int n)
    {
        if (n == 0) { return 0; }
        else if (n == 1) { return 1; }
        else
        {
            var t1 = Fibonacci(n - 1);
            var t2 = Fibonacci(n - 2);
            return (await t1) + (await t2);
        }
    }

    static int Main(string[] args)
    {
        var fib = Fibonacci(25);
        fib.Wait();
        Console.WriteLine( fib.Result );
        Console.ReadKey();
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

在迈克尔的提示下,我尝试在异步函数中创建任务,它可以工作.但我注意到异步函数返回一个Task类型值,它与Task.Run()相同.这两个任务都会立即运行,但t1不会自动运行到新线程中.所以任何人都可以告诉我,这两项任务之间有什么不同.我可以让异步函数自动运行到新线程吗?

    async static Task<string> Async1()
    {
        return DateTime.Now.ToString();
    }
    static void Main(string[] args)
    {
        Task<string> t1 = Async1();
        Task<string> t2 = Task.Run<string>(() => { return DateTime.Now.ToString(); });
    }
Run Code Online (Sandbox Code Playgroud)

Mic*_*ray 5

首先,您正在使用实验性CTP来实现.NET 4.5的异步/等待模型.你应该期望事情在这样的环境中表现得很尴尬.

其次,你是否意识到你最后无限期地睡觉了?

第三,您的应用基本上是同步的.您创建一个异步任务,然后立即等待它.async/await模型不会添加并发性,只会异步.它只是允许您的应用程序在执行多项操作时做出响应; 它不会自动并行化.这就是为什么您的应用程序就像它是同步的那样.