【问题标题】:Terminate or exit C# Async method with "return"使用“return”终止或退出 C# 异步方法
【发布时间】:2014-07-31 09:46:29
【问题描述】:

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

  1. 如果async 方法未通过输入参数或空检查,最好的转义方法是什么?

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

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

【问题讨论】:

  • 一般来说,你写一个async方法就像你写一个同步方法一样。方法完成后返回;错误抛出异常。

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


【解决方案1】:

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

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


  • CancellationToken 允许调用者取消操作,但您所描述的情况并非如此。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-18
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多