我认为它们基本上是同一回事–编写在处理器之间(在具有2个以上处理器的机器上)将任务分割的程序。然后,我正在阅读this,它说:
异步方法旨在作为非阻塞操作。在等待任务运行时,异步方法中的等待表达式不会阻塞当前线程。取而代之的是,表达式将方法的其余部分作为继续进行签名,并将控制权返回给异步方法的调用者。
async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不会在自己的线程上运行。该方法在当前同步上下文上运行,并且仅在该方法处于活动状态时才在线程上使用时间。您可以使用Task.Run将受CPU约束的工作移至后台线程,但是后台线程对仅等待结果可用的进程没有帮助。
我想知道是否有人可以帮我翻译成英文。似乎在异步性(是一个词?)和线程之间进行了区分,这意味着您可以拥有一个具有异步任务但没有多线程的程序。
现在,我了解了异步任务的想法,例如pg上的示例。乔恩·斯基特(Jon Skeet)的《C#深度》第 467页,第三版
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();
}
}
该async
关键字的意思是“ 这个功能,无论何时它被调用时,不会在这是需要的一切它的完成被称为它的呼叫后,上下文调用。”
换句话说,将其写在某些任务的中间
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
,由于DisplayWebsiteLength()
与x
或无关y
,将导致DisplayWebsiteLength()
“在后台”执行,例如
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
显然,这是一个愚蠢的例子,但是我是正确的,还是我完全感到困惑?
(此外,我对于上面的函数为什么sender
以及e
从未使用过它感到困惑。)
sender
并e
暗示这实际上是一个事件处理程序-几乎是唯一需要的地方async void
。最有可能的是,这是在单击按钮或类似操作时调用的-结果是此操作相对于应用程序的其余部分完全异步发生。但是它仍然全部集中在一个线程上-UI线程(在将回调发送到UI线程的IOCP线程上只有很少的时间)。