C#中的 async void 、 async Task与async Task<TResult>

本文介绍了异步方法的返回类型,如asyncTask和asyncTask<TResult>的区别,强调了asyncvoid在事件处理中的应用以及其调用限制。同时讨论了如何处理async方法中抛出的异常,包括在SynchronizationContext中的行为。
摘要由CSDN通过智能技术生成

异步方法可具有以下返回类型

  • Task:如果方法不含任何 return 语句或包含不返回操作数的 return 语句,则将 Task  用作返回类型;
  • Task<TResult>:如果方法包含指定 TResult 类型操作数的 return 语句,将 Task<TResult> 指定为返回类型; 
  • void:对于除事件处理程序以外的代码,通常不鼓励使用async void方法,因为调用方不能await那些方法,并且必须实现不同的机制来报告完成或错误条件。
  • 还可以指定任何其他返回类型,前提是返回类型包含GetAwaiter方法
    即​GetAwaiter 方法返回的对象必须实System.Runtime.CompilerServices.ICriticalNotifyCompletion 接口。
    例如,ValueTask<TResult>类型属于此类实现。可用于System.Thread.Tasks.Entensions的NuGet包方式可用。
  • IAsyncEnumerable<T>(对于返回异步流的异步方法)


 


总结:

主要使用aysnc void返回类型来定义事件处理程序,这些处理程序需要此返回类型。异步事件处理程序通常用作异步程序的起始点。

aysnc void返回异步方法的调用不能等待,并且无法捕获该方法引发的异常。

aysnc void方法依法任何异常都会直接在SynchronizationContext(在async void 方法启动时处于活动状态)上引发

async Task与async Task<TResult>方法引发异常时,会捕获该异常,并将异常至于Task对象上。

C#async和await是用于异步编程的关键字,可以让开发者更方便地进行异步编程。下面是async和await的详细使用方法: 1. 异步方法的定义 在定义异步方法时,需要在方法前面加上async关键字。异步方法的返回值类型必须是TaskTask<TResult>。 ```csharp public async Task<int> DoAsync() { //执行异步操作 return 1; } ``` 这里定义了一个异步方法DoAsync,该方法返回一个Task<int>对象,包含异步操作的返回值。 2. 异步方法的调用 在调用异步方法时,需要在方法前面加上await关键字。await会等待异步方法执行完成,并获取其返回值。 ```csharp int result = await DoAsync(); ``` 这里调用DoAsync方法,并使用await关键字等待其执行完成,并获取其返回值。 3. 异步方法的异常处理 在异步方法可能会发生异常,需要使用try/catch语句来捕获异常。异步方法的异常可以使用throw语句抛出,也可以使用Task.FromException方法创建一个Task对象来表示异常。 ```csharp public async Task<int> DoAsync() { try { //执行异步操作 return 1; } catch(Exception ex) { //处理异常 throw ex; } } ``` 4. 异步方法的延续操作 在异步方法可以使用await关键字来等待另一个异步方法执行完成,并在其执行完成后执行一些操作。 ```csharp public async Task<int> DoAsync() { int result = await Task.Run(() => { //执行异步操作 return 1; }); //处理异步操作执行结果 return result; } ``` 这里在异步方法调用Task.Run方法执行另一个异步操作,使用await关键字等待其执行完成,并获取其返回值。 5. Task的等待 在异步方法,可以使用Task的Wait方法等待异步操作执行完成。需要注意的是,使用Wait方法会阻塞当前线程,因此需要在后台线程执行异步操作。 ```csharp public async Task<int> DoAsync() { Task<int> task = Task.Run(() => { //执行异步操作 return 1; }); task.Wait(); //处理异步操作执行结果 return task.Result; } ``` 这里使用Task.Wait方法等待异步操作执行完成,并使用Task.Result属性获取异步操作的返回值。 以上就是async和await的一些常用使用方法,利用async和await可以更方便地进行异步编程。需要注意的是,在使用async和await时需要注意线程安全问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值