我想知道是否有人能够为我翻译一下。它似乎区分了异步性(这是一个词吗?)和线程,并暗示您可以编写具有异步任务但没有多线程的程序。异步方法旨在成为非阻塞操作。异步方法中的await表达式在等待任务完成时不会阻塞当前线程。相反,该表达式将方法的其余部分注册为后续操作,并将控制权返回给异步方法的调用者。
async和await关键字不会创建额外的线程。异步方法不需要多线程,因为异步方法不在自己的线程上运行。该方法在当前同步上下文上运行,并仅在方法处于活动状态时使用线程时间。您可以使用Task.Run将CPU密集型工作移至后台线程,但后台线程无法帮助等待结果变得可用的进程。
现在我理解了异步任务的概念,例如Jon Skeet的《C# In Depth, Third Edition》第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
感到困惑。)
using
语句中使用HttpClient
- 在负载较重的情况下,代码可能会用尽可用的套接字数量,导致SocketException错误。有关更多信息,请参阅Improper Instantiation。 - Gan