异步编程和多线程有什么区别?
我认为它们基本上是相同的 - 编写在处理器之间分割任务的程序(在具有2个以上处理器的机器上)。然后我正在阅读https://msdn.microsoft.com/en-us/library/hh191443.aspx,其中说
异步方法旨在实现非阻塞操作。在等待任务运行时,异步方法中的await表达式不会阻止当前线程。相反,表达式将方法的其余部分作为延续进行注册,并将控制权返回给异步方法的调用者。
async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不能在自己的线程上运行。该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间。您可以使用Task.Run将CPU绑定的工作移动到后台线程,但后台线程无助于只等待结果可用的进程。
我想知道是否有人可以为我翻译成英文。它似乎区分了异步性(是一个单词?)和线程,并暗示你可以拥有一个具有异步任务但没有多线程的程序。
现在我理解异步任务的想法,例如pg上的示例。Jon Skeet的C#In Depth,第三版中的 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
并且从未在上述功能的主体中使用过。)
元芳怎么了
相关分类