Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中将void转换为异步返回#_C#_Async Await - Fatal编程技术网

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

C# 在C中将void转换为异步返回#,c#,async-await,C#,Async Await,我读到,从C#async调用返回void是不好的。但我有以下情况: public async void MainFunction() { await DoSomething() await DoSomethingMore() } public void DoSomething() { //some code that I want to execute (fire and forget) } public void DoSomethingMore() { /

我读到,从C#
async
调用返回
void
是不好的。但我有以下情况:

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
?如果我把它改为returntask,因为我的代码根本不需要返回任何东西,我应该返回什么

如果我将其更改为returntask,因为我的代码在 好吧,我该还什么

您当前的代码不会编译,因为您不能对
void
返回方法执行
wait
(因为它不返回waitable,而waitable是一种公开
GetAwaiter
方法的类型)

同步世界中的任何
void
方法在异步世界中都应该返回一个
Task
。这允许任何希望异步等待异步操作的人,也有机会正确处理异常。使用
async void
意味着异常将被吞没,或者如果在配置中设置为,则将在任意线程池线程上重新释放。异步应该一直正确传播

请注意,当您在
mainfunctionsync
中等待这两个操作时,您并没有触发和忘记,而是异步地等待它们中的每一个按顺序完成

public async Task MainFunctionAsync()
{
    await DoSomethingAsync();
    await DoSomethingMoreAsync();
}

public Task DoSomethingAsync() 
{
    // Do meaningful async stuff
}

public Task DoSomethingMoreAsync()
{
    // Do more meaningful async stuff
}

你可以退回其中一个

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

你不能
wait
这些方法-它们没有被标记为异步的。
Main
不能
async
@shay_uuuuuu,不-你不能
wait
这些方法,因为它们不返回任务(或者更确切地说,是一个可等待的)async与之无关。@shay_uuuuuuuuuuuu。不在我的编译器中。这只是意味着您不必显式返回任务,但方法签名仍然必须将
任务
(或另一个可等待的)作为返回类型。@shay\uuu您永远不能等待一个方法,而是等待一个可等待的值。通常是一项任务<代码>无效不是值,不可等待
async
对调用方没有任何影响。Task.FromException包含得很好,就像.Net 4.8中的注释一样,您应该使用Task.CompletedTask