任务没有等待完成并且错误超时协议错误2504

时间:2018-07-03 18:07:42

标签: c# asynchronous task

我有一个带有此构造函数的类:

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()完成才能使用我需要的数据呢?

1 个答案:

答案 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,以便可以等待它。