首页 / C# / async(C# 参考)
async(C# 参考)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了async(C# 参考),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8835字,纯文字阅读大概需要13分钟。
内容图文
![async(C# 参考)](/upload/InfoBanner/zyjiaocheng/710/21c0a34a59c7486baba3e4d79a63a409.jpg)
async(C# 参考)
- 如果对方法或表达式使用此修饰符,则其称为异步方法 。 如下示例定义了一个名为
ExampleMethodAsync
的异步方法: C#
public async Task<int> ExampleMethodAsync() { // . . . . }
如果不熟悉异步编程,或者不了解异步方法如何在不阻止调用方线程的情况下使用 await?运算符完成可能需要长时间运行的工作,请阅读使用 async 和 await 的异步编程中的说明。 如下代码见于一种异步方法中,且调用 HttpClient.GetStringAsync 方法:
C#string contents = await httpClient.GetStringAsync(requestUrl);
异步方法同步运行,直至到达其第一个 await
表达式,此时会将方法挂起,直到等待的任务完成。 同时,如下节示例中所示,控件将返回到方法的调用方。
如果 async
关键字修改的方法不包含 await
表达式或语句,则该方法将同步执行。 编译器警告将通知你不包含 await
语句的任何异步方法,因为该情况可能表示存在错误。 请参阅编译器警告(等级 1)CS4014。
async
关键字是上下文关键字,原因在于只有当它修饰方法、lambda 表达式或匿名方法时,它才是关键字。 在所有其他上下文中,都会将其解释为标识符。
示例<a aria-labelledby="example" docon-link="" heading-anchor"="" href="https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/async?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(async_CSharpKeyword)%3Bk(DevLang-csharp)%26rd%3Dtrue#example" style="box-sizing: inherit; text-decoration-line: none; word-wrap: normal; outline: 0px; font-family: docons; font-size: 0.8em; speak: none; display: inline-block; font-weight: 400; text-align: center; direction: ltr; line-height: 16px; -webkit-font-smoothing: antialiased; transition: opacity 0.1s linear; vertical-align: middle; margin: -1px; border: 0px; clip: rect(1px 1px 1px 1px); clip-path: inset(50%); height: 1px; overflow: hidden; padding: 0px; position: absolute; width: 1px; opacity: 0;">
下面的示例展示了异步事件处理程序 StartButton_Click
和异步方法 ExampleMethodAsync
之间的控制结构和流程。 此异步方法的结果是 Web 页面的字符数。 此代码适用于在 Visual Studio 中创建的 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用;请参见有关设置应用的代码注释。
可以在 Visual Studio 中将此代码作为 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用运行。 需要一个名为 StartButton
的按钮控件和一个名为 ResultsTextBox
的文本框控件。 切勿忘记设置名称和处理程序,以便获得类似于以下代码的内容:
<code "left""="" a="" data-author-content='<Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75" Click="StartButton_Click" Name="StartButton"/> <textbox horizontalalignment=' height='"137"' margin='"88,140,0,0"' name='"ResultsTextBox"/' text='"<Enter' textwrapping='"Wrap"' url>"="" verticalalignment='"Top"' width='"310"'> " style="box-sizing: inherit; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 1em; direction: ltr; position: relative; border: 0px; padding: 0px; display: block; line-height: 19px;"><Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75" Click="StartButton_Click" Name="StartButton"/> <TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap" Text="<Enter a URL>" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
将代码作为 WPF 应用运行:
- 将此代码粘贴到 MainWindow.xaml.cs 中的
MainWindow
类中。 - 添加对 System.Net.Http 的引用。
- 为 System.Net.Http 添加一个
using
指令。
将此代码作为 Windows 应用商店应用运行:
- 将此代码粘贴到 MainPage.xaml.cs 中的
MainPage
类中。 - 为 System.Net.Http 和 System.Threading.Tasks 添加 using 指令。
private async void StartButton_Click(object sender, RoutedEventArgs e) { // ExampleMethodAsync returns a Task<int>, which means that the method // eventually produces an int result. However, ExampleMethodAsync returns // the Task<int> value as soon as it reaches an await. ResultsTextBox.Text += "\n"; try { int length = await ExampleMethodAsync(); // Note that you could put "await ExampleMethodAsync()" in the next line where // "length" is, but due to when '+=' fetches the value of ResultsTextBox, you // would not see the global side effect of ExampleMethodAsync setting the text. ResultsTextBox.Text += String.Format("Length: {0:N0}\n", length); } catch (Exception) { // Process the exception if one occurs. } } public async Task<int> ExampleMethodAsync() { var httpClient = new HttpClient(); int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length; ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n"; // After the following return statement, any method that's awaiting // ExampleMethodAsync (in this case, StartButton_Click) can get the // integer result. return exampleInt; } // The example displays the following output: // Preparing to finish ExampleMethodAsync. // Length: 53292
重要
若要深入了解各项任务以及在等待任务期间所执行的代码,请参阅使用 async 和 await 的异步编程。 有关使用类似元素的完整 WPF 示例,请参阅演练:使用 Async 和 Await 访问 Web。
返回类型<a aria-labelledby="return-types" docon-link="" heading-anchor"="" href="https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/async?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(async_CSharpKeyword)%3Bk(DevLang-csharp)%26rd%3Dtrue#return-types" style="box-sizing: inherit; text-decoration-line: none; word-wrap: normal; outline: 0px; font-family: docons; font-size: 0.8em; speak: none; display: inline-block; font-weight: 400; text-align: center; direction: ltr; line-height: 16px; -webkit-font-smoothing: antialiased; transition: opacity 0.1s linear; vertical-align: middle; margin: -1px; border: 0px; clip: rect(1px 1px 1px 1px); clip-path: inset(50%); height: 1px; overflow: hidden; padding: 0px; position: absolute; width: 1px; opacity: 0;">
异步方法可具有以下返回类型:
- Task
- Task
- void。 对于除事件处理程序以外的代码,通常不鼓励使用
async void
方法,因为调用方不能await
那些方法,并且必须实现不同的机制来报告成功完成或错误条件。 - 从 C# 7.0 开始,任何具有可访问的
GetAwaiter
方法的类型。System.Threading.Tasks.ValueTask<TResult>
类型属于此类实现。 它通过添加 NuGet 包System.Threading.Tasks.Extensions
的方式可用。
此异步方法既不能声明任何 in、ref 或 out 参数,也不能具有引用返回值,但它可以调用具有此类参数的方法。
如果异步方法的 语句指定一个 类型的操作数,则应指定 Task<TResult>
作为方法的返回类型TResult
。 如果当方法完成时未返回有意义的值,则应使用 Task
。 即,对方法的调用将返回一个 Task
,但是当 Task
完成时,任何等待 await
的所有 Task
表达式的计算结果都为 void
。
你应主要使用 void
返回类型来定义事件处理程序,这些处理程序需要此返回类型。 void
返回异步方法的调用方不能等待,并且无法捕获该方法引发的异常。
从 C# 7.0 开始,返回另一个类型(通常为值类型),该类型具有 GetAwaiter
方法,可尽可能减少性能关键代码段中的内存分配。
有关详细信息和示例,请参阅异步返回类型。
请参阅
内容总结
以上是互联网集市为您收集整理的async(C# 参考)全部内容,希望文章能够帮你解决async(C# 参考)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。