使用" return"终止或退出C#异步方法

时间:2014-07-31 09:46:29

标签: c# asynchronous task-parallel-library async-await cancellation-token

我是async-awaitC# 5.0方法的新手,我脑子里几乎没有问题

  1. 如果输入参数或空检查失败,那么转义async方法的最佳方法是什么?

  2. 在任务return;方法中使用async的逻辑流程是什么(在某些情况下,它变成了无限循环)?

  3. 在这种情况下,CancellationTokenTask.Yield更适合吗?

  4. public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }
    
    private async Task OnUploadSuccessAsync(AzureBlobInfo info)
    {
        if (this.UploadSuccessCallBackAsync == null)
        {
            return;
        }
    
        var transactionType = this.FormData.Get("transactionType");
        if (string.IsNullOrEmpty(transactionType))
        {
            transactionType = "unknown";
        }
    
        await this.UploadSuccessCallBackAsync(info, transactionType);
    }
    

3 个答案:

答案 0 :(得分:11)

在某些问题上失败的最好方法&#34;恕我直言会抛出相应的例外,如果你愿意避免例外,你绝对可以使用return;

这将创建一个同步完成的已完成/故障任务,因此使用await的调用者将获得完成的任务并继续使用相同的线程。


  • CancellationToken允许来电者取消操作,这不是您所描述的情况。

  • Task.Yield不会终止任何操作,它只会让其他任务运行一段时间并重新安排自己以供日后使用。

答案 1 :(得分:1)

您可以随时安全地从异步方法返回。在你的情况下(返回任务的方法),编译器将生成一个终止的任务,所以等待你的函数的任何调用者都将继续。

答案 2 :(得分:0)

当从async方法抛出异常时,它会在任务中被捕获,因此在通过调用Task.Wait()Task.Result,等待任务或观察任务之前,不会抛出异常访问任务的Exceptions属性。

就输入参数而言,解决这个问题的一种方法是将方法拆分为两部分,第一部分检查输入参数,然后调用第二个方法async。请参阅Stephen Cleary的this个问题答案。这样,输入参数异常将直接抛出该方法返回的任务之外。