异步编程和多线程有什么区别?

问题描述 投票:172回答:2

我以为它们基本上是同一件事–编写在处理器(在具有2个以上处理器的机器上)之间拆分任务的程序。然后我正在阅读this,它说:

异步方法旨在成为非阻塞操作。等待异步方法中的表达式不会阻塞当前线程等待的任务正在运行。相反,该表达式将其余部分签名方法的延续,并将控制权返回给的调用者异步方法。

async和await关键字不会导致其他线程成为创建。异步方法不需要多线程,因为异步方法不会在其自己的线程上运行。该方法在当前同步上下文,并且仅当方法已激活。您可以使用Task.Run将受CPU约束的工作移至后台线程,但是后台线程对进程没有帮助那只是在等待结果公布。

而且我想知道是否有人可以帮我将其翻译成英文。似乎在异步性(是一个词?)和线程之间进行了区分,这意味着您可以拥有一个具有异步任务但没有多线程的程序。

现在,我了解异步任务的概念,例如pg上的示例。乔恩·斯凯特(Jon Skeet)的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(); } }
async关键字的意思是<< [此函数,无论何时被调用,在被调用后所有事情都需要完成该函数的上下文中将不会被调用。“

换句话说,将其写在某些任务的中间

int x = 5; DisplayWebsiteLength(); double y = Math.Pow((double)x,2000.0);

,因为DisplayWebsiteLength()xy无关,将导致DisplayWebsiteLength()在“后台”执行,例如

                processor 1                |      processor 2
-------------------------------------------------------------------
int x = 5;                                 |  DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0);     |

显然,这是一个愚蠢的例子,但是我是正确的还是我完全感到困惑还是什么?

(而且,我对为什么在上述函数的主体中从未使用sendere感到困惑。)

我以为它们基本上是同一件事–编写在处理器(在具有2个以上处理器的机器上)之间拆分任务的程序。然后,我正在读这篇文章,它说:异步方法是...

c# multithreading asynchronous parallel-processing async-await
2个回答
450
投票

20
投票
© www.soinside.com 2019 - 2024. All rights reserved.