C#异步/等待等待不等待

Geo*_*uke -1 c# async-await

我正在使用.Net 4.7.2和C#7

在一个类中有服务器方法,所有方法都是无效的。其中一些可以异步执行,其他一些则必须顺序执行。所以我为水货定义了一个清单

private void ExecuteSequential()
{
    SomeMethod1();
    SomeMethod2();
    ExecuteParallelAsync();
    SomeMethod3();
    SomeMethod4();
}


private async void ExecuteParallelAsync()
{
    List<Action> methods = new List<Action>()
    {
        MyMethod1,
        MyMethod2,
        MyMethod3
    };


    await Task.Run( () => { Parallel.ForEach( methods , ( currentMethod ) => currentMethod.Invoke() ); } );            
}
Run Code Online (Sandbox Code Playgroud)

SomeMethod3碰巧执行之前,ExecuteParallelAsync应该完全完成。因为不是这种情况,所以我对async和await的使用显然存在问题。

我做错了什么?

提前致谢!

Mar*_*ell 11

async void-所有赌注都关闭了;在现实中,你应该永远不会async void,除非你的方法是微小的微小一套需要它的极端的角落的情况下,如异步事件处理程序。

在SomeMethod3碰巧执行之前,ExecuteParallelAsync应该完全完成。

它怎么可能知道?它是:async void,这意味着它不会向调用方提供任何指示状态的信息

做到这一点,它必须是:

private async Task ExecuteParallelAsync() // or ValueTask
Run Code Online (Sandbox Code Playgroud)

必须在呼叫现场等待

await ExecuteParallelAsync();
Run Code Online (Sandbox Code Playgroud)

  • @GeorgeDuke的关键是添加`async`,但是是的:出于所有相同的原因,使它成为`async Task`,而不是`async void`是个好主意。 (2认同)