我有一个带有此构造函数的类:
ast.literal_eval
此代码在本地数据库中有效,但是当我连接到远程计算机上的数据库时,出现超时和协议2504错误。
如果我进行调试,我会注意到,如果我在运行MyType01 _myData01;
MyType02 _myData02;
MyType03 _myData03;
public MyClass()
{
getDataFromDataBase();
//Code that use the data from database.
string myText = _myData02.Property1; //error because my data02 is null.
}
private async void getDataFromDataBase()
{
await myMethod01Async();
await myMethod02Async();
await myMethod03Async();
}
的行中设置了一个断点并按“ F5”,则下一行代码是构造函数中尝试使用的下一行myMethod01Asyc()
变量中的数据,但它仍为null,因为它没有完成方法_myData02
的作用。
也许我是错的,但是我认为使用await代码会等到方法完成为止,但就我而言,这不是行为,因为它会在构造函数中的下一行继续。
那么我怎么能在构造函数中等到getMyData02Async()
完成才能使用我需要的数据呢?
答案 0 :(得分:3)
除事件处理程序外,避免使用async void
。
引用Async/Await - Best Practices in Asynchronous Programming
我建议您创建一个事件处理程序并在那里等待任务。
MyType01 _myData01;
MyType02 _myData02;
MyType03 _myData03;
public MyClass() {
//subscribe to event
LoadingData += OnLoadingData;
//raise event
LoadingData(this, EventArgs.Empty);
}
private event EventHandler LoadingData = delegate { };
private async void OnLoadingData(object sender, EventArgs args) {
await getDataFromDataBase();
//Code that use the data from database.
string myText = _myData02.Property1;
}
private async Task getDataFromDataBase() {
await myMethod01Async();
await myMethod02Async();
await myMethod03Async();
}
请注意更改getDataFromDataBase
以返回Task
,以便可以等待它。