19

我对async-awaitin 中的方法C# 5.0不熟悉,我的脑海中没有几个问题

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

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

  3. 在这种情况下是否CancellationTokenTask.Yield合适?

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);
}
4

3 回答 3

15

“在某些问题上失败”恕我直言,最好的方法是抛出适当的异常,return;如果您希望避免异常,您绝对可以使用。

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


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

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

于 2014-07-31T09:52:19.113 回答
2

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

于 2014-07-31T09:53:10.750 回答
0

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

就输入参数而言,一种解决方法是将方法分成两部分,第一个检查输入参数,然后调用第二个方法,即async. 有关示例,请参见Stephen Cleary 的此问题回答。这样,输入参数异常将立即在方法返回的任务之外被抛出。

于 2014-07-31T10:19:36.143 回答