偶然发现了有关发出异步Web请求的帖子。
除了简单性之外,如果在现实世界中,您所要做的就是发出一个异步请求并在下一行等待它,这与首先发出一个同步调用不是一样吗?
偶然发现了有关发出异步Web请求的帖子。
除了简单性之外,如果在现实世界中,您所要做的就是发出一个异步请求并在下一行等待它,这与首先发出一个同步调用不是一样吗?
Answers:
不,async + await != sync
是因为继续
来自MSDN,“使用Async和Await进行异步编程(C#和Visual Basic)”
异步方法旨在作为非阻塞操作。当等待的任务运行时,异步方法中的等待表达式不会阻塞当前线程。取而代之的是,表达式将方法的其余部分作为继续进行签名,并将控制权返回给async方法的调用者。
例如,异步执行将不会阻止UI线程,并且Some TextBox.Text
将在下载完成后进行更新
private async void OnButtonClick()
{
SomeTextBox.Text = await new WebClient().DownloadStringTaskAsync("http://stackoverflow.com/");
}
Console.WriteLine(await GetStringOverNetwork());
呢 如果您需要异步调用的输出怎么办?即使线程可能继续执行,程序在第一次访问时也会阻塞吗?
我偶然想到了同样的问题,但在阅读了回答后,这个问题似乎依然存在,并被“引擎盖下的魔术”所迷惑。
通过上述异步编程 :
- 该
async
关键字把一个方法为异步方法,它允许你使用await
关键词在它的身上。- 当
await
应用关键词时,它暂停调用方法和产量控制返回给调用者直到等待任务完成。await
只能在方法内部使用async
。
遇到的上下文是否await
被阻止?
应用程序的其余部分是否在处阻塞await
?
这取决于您的应用程序的编写方式。如果是await
在相同上下文中按顺序启动的一系列相关ed任务(请参阅:试图了解一些异步/等待行为)
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
这样,每个对象await
都会阻止下一个对象的生成。
另一方面,并行启动的相同从属任务将并行执行,并且上下文只会在响应时阻塞。await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
通常,await
产生执行到外部上下文,从该外部上下文调用当前上下文。但是,如果外部上下文本身正在等待当前电流,则就像await
在同一上下文中的s一样。
因此,为了获得async
好处,需要将应用程序设计为运行多个并行上下文(UI,数据客户端等),然后await
在一个上下文中产生对其他上下文的执行,因此整个应用程序不会在单个对象上阻塞await
。