【发布时间】:2012-05-02 00:29:39
【问题描述】:
我想学习如何在一些同步程序中添加并发,并以斐波那契算法为例。我写了这些代码,但我发现它根本没有任何并发性。所有代码都在单个线程中运行,直到完成。谁能向我解释为什么它不反映异步?
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;
}
在 Michael 的提示下,我尝试在 async 函数中创建任务,它可以工作。 但我注意到异步函数返回一个任务类型值,它与 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(); });
}
【问题讨论】:
-
没有反应是什么意思?运行程序时会发生什么?
-
你希望它有什么反应?
-
我希望你知道这是一个非常低效的算法(提示:计算 fib(20) 的计算频率)?好的,可以测试异步工作(需要很长时间:-))。
-
这个算法的阶数不好(O(2^N))。对于多项式顺序,您可以使用动态规划或计算斐波那契矩阵...您需要更多帮助吗?
-
我只是以斐波那契算法为例。我知道它可能不适合改为多线程。
标签: c# multithreading asynchronous concurrency async-await