首页 > 解决方案 > Javascript 与 C# 中的异步/等待

问题描述

我试图了解异步编程并遇到了 async/await 关键字。我一直在理解 async/await 关键字的使用。我实际上查看了两种编程语言,JavaScript 和 C#,发现两种语言在使用 async/await 关键字方面存在很大差异。

对于 JavaScript,它说:

Async/await 使您的代码看起来是同步的,并且在某种程度上它使其行为更加同步。await 关键字会阻止执行它之后的所有代码,直到 promise 完成,这与同步操作完全一样。

链接:https ://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await#:~:text=Async%2Fawait%20makes%20your%20code,would%20with%20a%20synchronous%20operation .

因此,它说 async/await 将使执行同步。

对于 C#,它说:

async 关键字将方法转换为异步方法,这允许您在其主体中使用 await 关键字。应用 await 关键字时,它会暂停调用方法并将控制权交还给调用者,直到等待的任务完成。

链接:https ://docs.microsoft.com/en-us/dotnet/csharp/async#:~:text=The%20async%20keyword%20turns%20a,used%20inside%20an%20async%20method 。

因此,据说使用 async/await 将使代码执行异步。

我想问一下,在 JavaScript 和 C# 中使用 async/await 关键字真的有区别吗?

或者,

上述陈述中是否缺少某些内容?

标签: javascriptc#asynchronousasync-await

解决方案


我不熟悉 JavaScript,但这个声明:

Async/await 使您的代码看起来是同步的,并且在某种程度上它使其行为更加同步。await 关键字会阻止执行它之后的所有代码,直到 promise 完成,这与同步操作完全一样。

听起来非常适用于 C# async/await。对于这两种情况,您的代码看起来像您同步执行它并且您的执行是顺序的。因为在 C# 中,当你有这样的代码时:

// ...
await FooAsync();
Console.WriteLine("Await has returned the execution");

好像您的执行线程正在运行FooAsync,然后,同一个线程正在调用Console.WriteLine. 而实际上当执行线程命中时await,它在幕后做了很多事情。这是一篇关于它的好文章。但在大多数情况下,

应用 await 关键字时,它会暂停调用方法并将控制权交还给调用者,直到等待的任务完成。

执行您的代码的线程将处理他的事务。然后继续Console.WriteLine何时FooAsync由另一个(或相同)线程完成。当您在 WPF 或 WinForms 应用程序中使用 UI 线程时,此行为非常有用。例如,FooAsync是一种很重的方法。它进行大量计算并需要大量时间才能完成。但是您在 UI 上运行代码,当用户点击按钮时,底层代码由 UI 线程执行。因此,如果您将FooAsync像这样同步运行和等待:

FooAsync().Result;

您的用户界面将被“冻结”,用户会淘汰您。所以当你走

await FooAsync();

UI 线程“要求”TaskSchedulerFooAsync由任何可用线程运行。Task 完成后,TaskScheduler 尝试执行下一行:

Console.WriteLine("Await has returned the execution");

再次由 UI 线程,

与同步操作完全一样。


推荐阅读