控制台应用程序中的异步

Max*_*hen 1 c# asynchronous

在此示例代码中,代码以同步方式运行.为什么任务阻止DoIndependentWork()而不是仅阻止webTask.Result?我知道我可以使用Task.Run()和其他东西,但我正在尝试理解异步并等待更好一点.

static void Main(string[] args)
{
    var webTask = AccessTheWebAsync();
    DoIndependentWork();
    Console.WriteLine("AccessTheWebAsync result: {0}", webTask.Result);

    Console.ReadLine();
}

static async Task<int> AccessTheWebAsync()
{
    HttpClient client = new HttpClient();

    Thread.Sleep(5000);

    Console.WriteLine("AccessTheWebAsync in Thread {0}", Thread.CurrentThread.ManagedThreadId);

    var urlContents = await client.GetStringAsync("http://msdn.microsoft.com");

    return urlContents.Length;
}

static void DoIndependentWork()
{
    Console.WriteLine("DoIndependentWork in Thread {0}", Thread.CurrentThread.ManagedThreadId);
}
Run Code Online (Sandbox Code Playgroud)

AJ *_*son 5

您的异步方法仍然在与调用者相同的线程上运行; 它只是在遇到await呼叫时立即返回呼叫者.这就是为什么Thread.Sleep(5000)仍然阻止线程.

在async-await land中,您应该使用Task.Delay:

await Task.Delay(5000);
Run Code Online (Sandbox Code Playgroud)