Сбой конструктора Visual Studio при отображении элемента управления с асинхронным ожиданием в событии Load - PullRequest
0 голосов
/ 13 июня 2019

У меня есть элемент управления с именем (DevExpress) GridControl, и я сделал асинхронное событие Load, чтобы получить некоторые исходные данные и предоставить их источнику данных GridView. Когда я открываю конструктор родительского элемента управления B, который содержит элемент управления A, Visual Studio 2015 падает через несколько секунд и перезапускается.

Приложение работает без сбоев. Проблема только в конструкторе VS. То же самое происходит, если я помещаю этот блок кода в конструктор. Если я удаляю async await или просто не использую его в событии Load, все работает нормально. Это похоже на то, как дизайнер запускает код в Load и завершается ошибкой

private async void MyControl_Load(object sender, System.EventArgs e)
{
    List<MyObject> myObjects = await Task.Run(() => MethodThatReturnsDataFromDb());
    BindDataToGridControl(myObjects);
}

Предполагается, что асинхронное ожидание будет реализовано по-другому при применении в событии Load, это ошибка конструктора VS или я делаю что-то ужасно неправильно?

1 Ответ

0 голосов
/ 18 июня 2019

Как прокомментировал @HansPassant, решение состоит в том, чтобы пропустить функциональность, необходимую только во время выполнения, из DesignMode. Использование this.DesignMode может помочь в этом ( подробности см. Здесь ):

public new bool DesignMode
{
    get
    {
        return (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv");
    }
}

Простая ссылка this.DesignMode без реализации выше не будет работать в моем случае, так как элемент управления используется в другом элементе управления.

Впоследствии использование довольно просто в конструкторе или Load событие:

if (!this.DesignMode)
{
    // Code that should run only in runtime and not in Design Mode
    ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...