我是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);
}
答案 0 :(得分:11)
在某些问题上失败的最好方法&#34;恕我直言会抛出相应的例外,但如果你愿意避免例外,你绝对可以使用return;
。
这将创建一个同步完成的已完成/故障任务,因此使用await
的调用者将获得完成的任务并继续使用相同的线程。
CancellationToken
允许来电者取消操作,这不是您所描述的情况。
Task.Yield
不会终止任何操作,它只会让其他任务运行一段时间并重新安排自己以供日后使用。
答案 1 :(得分:1)
您可以随时安全地从异步方法返回。在你的情况下(返回任务的方法),编译器将生成一个终止的任务,所以等待你的函数的任何调用者都将继续。
答案 2 :(得分:0)
当从async
方法抛出异常时,它会在任务中被捕获,因此在通过调用Task.Wait()
,Task.Result
,等待任务或观察任务之前,不会抛出异常访问任务的Exceptions
属性。
就输入参数而言,解决这个问题的一种方法是将方法拆分为两部分,第一部分检查输入参数,然后调用第二个方法async
。请参阅Stephen Cleary的this个问题答案。这样,输入参数异常将直接抛出该方法返回的任务之外。