我读到从C#void
调用返回async
并不好。但我有以下情况:
public async void MainFunction()
{
await DoSomething()
await DoSomethingMore()
}
public void DoSomething()
{
//some code that I want to execute (fire and forget)
}
public void DoSomethingMore()
{
//some code that I want to execute (fire and forget)
}
因为我只想要执行该函数而根本没有返回。我应该这样保留,还是应该从DoSomething()返回Task
?如果我将其更改为返回任务,因为我的代码根本不需要返回任何内容,我应该返回什么内容?
答案 0 :(得分:8)
如果我将其更改为返回Task,因为我的代码需要不返回任何内容 所有,我该怎么回事?
您当前的代码无法编译,因为您无法在await
返回方法上void
(因为它不会返回等待的,这是一种公开{{1}的类型方法)。
同步世界中的任何GetAwaiter
方法都应在异步世界中返回void
。这允许任何希望异步等待异步操作的人,并且还有机会正确处理异常。使用Task
意味着将吞下异常,或者如果在配置中设置为异常,则将在任意线程池线程上重新抛出异常。异步应该一直传播正确。
请注意,当您等待async void
中的两个操作时,您不会触发并忘记,您将异步地等待每个操作按顺序完成。
MainFunctionAsync
答案 1 :(得分:0)
您可以返回其中任何一个
Task.FromCompleted;
Task.FromException(ex);
所以您的方法将如下所示:
public void MainFunction()
{
await DoSomething()
await DoSomethingMore()
}
public Task DoSomething()
{
try{
//some code that I want to execute (fire and forget)
return Task.FromCompleted;
}
catch(Exception ex){
return Task.FromException(ex);
}
}
//some code that I want to execute (fire and forget)
}
public Task DoSomethingMore()
{
try{
//some code that I want to execute (fire and forget)
return Task.FromCompleted;
}
catch(Exception ex){
return Task.FromException(ex);
}
}