我創建下面的代碼:異步和等待是單線程真的嗎?
using System;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main()
{
Console.WriteLine("M Start");
MyMethodAsync();
Console.WriteLine("M end");
Console.Read();
}
static async Task MyMethodAsync()
{
await Task.Yield();
Task<int> longRunningTask = LongRunningOperationAsync();
Console.WriteLine("M3");
//and now we call await on the task
int result = await longRunningTask;
//use the result
Console.WriteLine(result);
}
static async Task<int> LongRunningOperationAsync()
{
await Task.Delay(1000);
return 1;
}
}
}
輸出:
M Start
M end
M3
1
這很好,但是當我看在線程分析它顯示了這個: 然後將此: 而那麼這個:
所以它看起來像我產生線程,但是從MSDN說:
從異步編程與異步和等待:線程
異步和等待關鍵字不會造成額外的線程是 創建。異步方法不需要多線程,因爲異步方法不會在其自己的線程上運行。該方法在當前的 同步上下文上運行,並僅在 方法處於活動狀態時纔在線程上使用時間。您可以使用Task.Run將CPU綁定的工作移動到後臺線程,但後臺線程無助於僅等待結果可用的進程 。
我是否缺少或不理解某些東西? 謝謝。
它使用存在線程池中的線程,而不是創建一個 –
這看起來像是Visual Studio中非常漂亮的窗口。對不起這個題外話題,但哪個版本支持它? –
用'Thread.CurrentThread.ManagedThreadId'裝飾你的輸出,你可能會看到正在使用3個線程。 –