使用“return”终止或退出 C# 异步方法
-
21-12-2019 - |
题
我是新来的 async-await
中的方法 C# 5.0
, ,我心里有几个问题
逃离困境的最佳方法是什么
async
方法如果输入参数或空检查失败?使用的逻辑流程是什么
return;
在任务中async
方法(在某些情况下,它变成了无限循环)?是
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) 回答的问题为例。这样,输入参数异常将被直接抛出到方法返回的任务之外。
不隶属于 StackOverflow