我的工作流程:构造函数 - >调用异步方法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");
不会被命中,并且不会抛出任何异常。
我做错了什么?
答案 0 :(得分:0)
简而言之:是的,正如@fknx在评论中提到的那样,问题是代码是异步执行而不是等待,因此应用程序在到达相关行之前退出。
您的示例中有一些不良做法:
创建这样的东西并不是一个好主意,因为你没有跟踪任务。请始终将任务定义为返回值,它不需要任何费用,它将帮助您编写正确的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,或者其他等等)如果你想创建一个真正的异步应用程序,主方法(以及其他地方)的方法。