Visual Studio 设计器在 Load 事件中显示具有异步 await 的控件时崩溃



我有一个名为 A 的控件,其中包含一个 (DevExpress( GridControl,我使 Load 事件异步以获取一些初始数据并将它们提供给 GridView 数据源。当我打开包含控件 A 的父控件 B 的设计器时,Visual Studio 2015 在几秒钟后崩溃并重新启动。

应用程序运行平稳,无异常。问题仅在 VS 设计器中。如果我将此代码块放在构造函数中,也会发生同样的情况。如果我删除异步等待,或者如果我只是不在加载事件中使用它,一切正常。就像设计器在 Load 中运行代码并失败

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

在加载事件中应用时,await 异步是否应该以不同的方式实现,是 VS 设计器错误还是我做了一些可怕的错误?

正如@HansPassant所评论的,解决方案是从设计模式跳过运行时只需要的功能。使用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
    ....
}

最新更新