c# – 异步编程控制流程
我在过去2天一直在阅读有关c#异步方法的内容,根据我的理解,与线程(threadpool.queueuserworkitem())不同,对异步方法的调用不会立即返回,只有在被调用的方法命中时才会返回等待或完成(或例外)
请参阅以下示例. public partial class MainWindow : Window { // . . . private async void startButton_Click(object sender,RoutedEventArgs e) { // ONE Task<int> getLengthTask = AccessTheWebAsync(); // FOUR int contentLength = await getLengthTask; // SIX resultsTextBox.Text += String.Format("rnLength of the downloaded string: {0}.rn",contentLength); } async Task<int> AccessTheWebAsync() { // TWO HttpClient client = new HttpClient(); Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); // THREE string urlContents = await getStringTask; // FIVE return urlContents.Length; } } 根据我收集的内容,在上面的代码中,AccessTheWebAsync()被同步调用(即,在调用时,控件不会立即返回).但是在名为“THREE”的行中,运行时将返回控件. 我的问题是: >运行时如何决定何时使用线程池或何时在调用线程中运行任务? (即执行代码而不返回控制) 解决方法
首先重要的是:如果要等待的任务尚未完成,则运行时将仅在等待时返回到调用者.
问题1:我在这里引用MSDN:
Source 问题2:可能在GetStringAsync的实现中,但我们不知道,我们也不必知道它.这足以让我们知道GetStringAsync以某种方式得到它的结果而不会阻塞我们的线程. 问题3:如果循环放在await关键字之前,是的. 问题4:引用与以前相同的段落:
您不需要async和await关键字.例: private Task<int> DoSomethingAsync() { return Task.Run(() => { // Do CPU heavy calculation here. It will be executed in the thread pool. return 1 + 1; }); } 问题5:我会再次引用
Source(和以前一样,只是一个不同的部分) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |