我认为它们基本上是同一件事——编写在处理器之间分配任务的程序(在具有 2 个以上处理器的机器上)。然后我在读书this,其中说:
异步方法旨在成为非阻塞操作。等待
异步方法中的表达式不会阻塞当前线程,而
等待的任务正在运行。相反,该表达式签署了其余部分
该方法作为延续并将控制权返回给调用者
异步方法。
async 和await 关键字不会导致额外的线程
创建的。异步方法不需要多线程,因为异步方法
方法不在自己的线程上运行。该方法在当前运行
同步上下文并仅在以下情况下使用线程上的时间:
方法处于活动状态。您可以使用 Task.Run 将 CPU 密集型工作移至
后台线程,但后台线程对进程没有帮助
只是等待结果出来。
我想知道是否有人可以帮我将其翻译成英语。它似乎在异步性(这是一个词吗?)和线程之间进行了区分,并暗示您可以拥有一个具有异步任务但没有多线程的程序。
现在我理解了异步任务的想法,例如 pg 上的示例。 467 乔恩·斯基特的C# 深入探讨,第三版
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
The async
关键字的意思是“无论何时调用此函数,都不会在调用该函数后的所有内容都需要完成该函数的上下文中调用。”
换句话说,在某个任务的中间编写它
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, since DisplayWebsiteLength()
与以下无关x
or y
, 会引发DisplayWebsiteLength()
“在后台”执行,例如
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
显然这是一个愚蠢的例子,但我是正确的还是我完全困惑了还是什么?
(另外,我也很困惑为什么sender
and e
从未在上述函数体内使用过。)