Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在同一行中等待和异步_C#_Async Await - Fatal编程技术网

C# 在同一行中等待和异步

C# 在同一行中等待和异步,c#,async-await,C#,Async Await,我了解async的工作原理以及它与javascript承诺的比较,但我不确定下面这样的一行有什么好处 IdentityResult result = await UserManager.CreateAsync(user, model.password); 因为我们正在创建一个异步调用并立即等待线程,所以在异步调用完成之前,后面的行不会被执行。好处是,如果该操作是真正异步的,那么在某个时候调用线程将被释放以在应用程序中执行其他工作,而不是被阻塞同步地 这种用法带来了更高的可伸缩性 您仍在等待操作

我了解async的工作原理以及它与javascript承诺的比较,但我不确定下面这样的一行有什么好处

IdentityResult result = await UserManager.CreateAsync(user, model.password);

因为我们正在创建一个异步调用并立即等待线程,所以在异步调用完成之前,后面的行不会被执行。

好处是,如果该操作是真正异步的,那么在某个时候调用线程将被释放以在应用程序中执行其他工作,而不是被阻塞同步地

这种用法带来了更高的可伸缩性

您仍在等待操作完成后才能继续。异步方法不会神奇地运行得更快,但它们可能使用更少的资源,并且通常可以同时运行多个异步方法

如果我们设想
CreateAsync
如下所示:

async Task<IdentityResult> CreateAsync()
{
    // do something
    await Task.Delay(1000);
    // do something else
}
异步任务CreateAsync() { //做点什么 等待任务。延迟(1000); //做点别的 } 然后在
wait Task.Delay(1000)
中释放一个线程并异步等待,而不是保持一秒钟。该线程可以执行进程中的其他CPU操作,并避免上下文切换


如果正确实现了
CreateAsync
,则会有一些实际的异步操作,而不是
任务。延迟

让我们假设您有一个用户界面,并且每当按下按钮时都会调用函数UserManager.CreateAsync

我不知道CreateAsync函数,但由于它是异步的,可以等待,我猜设计者认为它需要足够长的时间才能异步执行

如果CreateAsync需要一分钟的时间,而且它是不可等待的,那么您的用户界面将在一分钟内失效


使用此方法,您的界面仍将具有响应性。如果您在CreateAync中使用CancellationToken作为参数,用户界面甚至可以决定取消任务,例如关闭程序。

这取决于操作的实现方式,但如果正确实现,它将在某个点释放等待异步操作的线程(例如IO或网络访问)要完成。立即等待线程-
wait
不会使线程等待,它会使方法的其余部分等待。这就是重点!