Задание не ожидает завершения и ошибка протокола тайм-аута 2504 - PullRequest
0 голосов
/ 03 июля 2018

У меня есть класс с этим конструктором:

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, но она по-прежнему равна нулю, поскольку не завершена, метод getMyData02Async().

Возможно, я ошибаюсь, но я подумал, что использование await кода ждет, пока метод не будет завершен, но в моем случае это не поведение, потому что оно продолжается со следующей строки в конструкторе.

Так как же мне ждать в конструкторе, пока getDataFromDataBase() не закончится, чтобы использовать нужные мне данные?

1 Ответ

0 голосов
/ 03 июля 2018

Избегайте async void за исключением обработчиков событий.

Ссылка Async / Await - Лучшие практики в асинхронном программировании

Я предлагаю вам создать обработчик событий и ждать там ваших заданий.

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, чтобы его можно было ожидать.

...