我是新来的 async-await 中的方法 C# 5.0, ,我心里有几个问题

  1. 逃离困境的最佳方法是什么 async 方法如果输入参数或空检查失败?

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

  3. CancellationToken 或者 Task.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);
}
有帮助吗?

解决方案

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

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


  • CancellationToken 允许 呼叫者,召集者 取消操作,这不是您所描述的情况。

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

其他提示

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

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

就输入参数而言,解决这个问题的一种方法是将方法分为两部分,第一个部分检查输入参数,然后调用第二个方法,即 async. 。看 以斯蒂芬·克利里 (Stephen Cleary) 回答的问题为例。这样,输入参数异常将被直接抛出到方法返回的任务之外。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top