【问题标题】:Task isn't waited to finish and error timeout protocol error 2504未等待任务完成和错误超时协议错误 2504
【发布时间】:2018-07-04 02:19:53
【问题描述】:

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

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();
}

此代码在本地数据库中工作,但是当我连接到远程计算机中的数据库时,我收到超时错误和协议 2504。

如果我调试,我会注意到,如果我在运行myMethod01Asyc() 的行中设置断点并按“F5”,则下一行代码是构造函数中尝试使用数据的下一行在_myData02变量中,但它仍然是null,因为它没有完成方法getMyData02Async()

也许我错了,但我认为使用 await 代码等到方法完成,但在我的情况下它不是行为,因为它继续构造函数中的下一行。

那么我怎么能在构造函数中等待getDataFromDataBase() 完成才能使用我需要的数据呢?

【问题讨论】:

    标签: c# asynchronous task


    【解决方案1】:

    避免使用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 以便可以等待。

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 2020-05-07
      • 2022-07-13
      • 2017-12-26
      • 2023-04-03
      • 2015-05-19
      • 2019-07-07
      • 2017-12-18
      • 2023-03-13
      相关资源
      最近更新 更多