在C#中将void转换为异步返回

时间:2015-09-01 12:52:11

标签: c# async-await

我读到从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?如果我将其更改为返回任务,因为我的代码根本不需要返回任何内容,我应该返回什么内容?

2 个答案:

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