いくつかの同期プログラムに並行性を追加する方法を学び、フィボナッチ アルゴリズムを例として取り上げます。これらのコードを書きましたが、同時実行性がまったくないことがわかりました。すべてのコードは、完了するまで単一のスレッドで実行されます。非同期が反映されない理由を誰かに説明してもらえますか?
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 を作成しようとしましたが、うまくいきました。しかし、非同期関数が Task タイプの値を返すことに気付きました。これは Task.Run() と同じです。どちらのタスクもすぐに実行されますが、t1は新しいスレッドで自動的に実行されません。これら2つのタスクの違いは何ですか?非同期関数を新しいスレッドで自動的に実行できますか?
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(); });
}