即使调用异步方法也不会执行异步方法

时间:2016-10-17 13:37:42

标签: c# .net asynchronous async-await

我的工作流程:构造函数 - >调用异步方法1 - >调用异步方法2 - >调用异步方法3

构造

public MyConstructor() {
    Method1();
}

方法一:

private async void Method1() {
    //do some stuff
    await Method2();
    //do some more stuff
}

方法2:

protected internal async Task Method2() {
    //do some stuff
    var x = await Method3("someParams");
    //do some more stuff
}

方法3:

public async Task<List<string>> Method3(string someParams) {
    Debug.WriteLine("I am here"); //Breakpoint doesn't get hitted, no output "I am here"
}

是的我知道,你可能想知道我为什么要使用这么多不同的异步方法..但还有更多的东西在继续(但没有任何影响问题!)。问题是,Debug.WriteLine("I am here"); 会被命中,并且不会抛出任何异常。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

简而言之:是的,正如@fknx在评论中提到的那样,问题是代码是异步执行而不是等待,因此应用程序在到达相关行之前退出。

您的示例中有一些不良做法:

async void方法

创建这样的东西并不是一个好主意,因为你没有跟踪任务。请始终将任务定义为返回值,它不需要任何费用,它将帮助您编写正确的API。

构造函数中的异步调用

这也不是一个好设计,因为(正如你所提到的)你不能在构造函数中等待这个方法,所以你只需启动任务并将其松散。请考虑使用异步 Init 方法。

所以不要这样:

public class MyCustomClass
{
    public MyCustomClass()
    {
        // BAD CODE, do not do this
        Method1();
    }

    private async Task Method1()
    {
        //do some stuff
        await Method2();
        //do some more stuff
    }
}

你可以这样做:

class Program
{
    static void Main(string[] args)
    {
        var m = new MyCustomClass();

        m.InitializeAsync().Wait();

        Console.WriteLine("Before exit...");
    }
}

public class MyCustomClass
{
    public MyCustomClass()
    {
        // in a constructor you should not do anything async
    }

    public async Task InitializeAsync()
    {
        await Method1();
    }

    private async Task Method1()
    {
        //do some stuff
        await Method2();
        //do some more stuff
    }
}

绝对等待主方法中的异步方法,或者确切地说,您的控制台应用应该只有只有一个等待(或者WaitAll,或者其他等等)如果你想创建一个真正的异步应用程序,主方法(以及其他地方)的方法。