【问题标题】:AsyncCallback throws exceptionAsyncCallback 抛出异常
【发布时间】:2011-07-07 18:21:58
【问题描述】:

在 Winform 中出现异常:“在创建窗口句柄之前,无法在控件上调用 Invoke 或 BeginInvoke”在 AsyncCallback 期间。

该应用程序在其他计算机上正常运行。我想知道是否有可能导致异常的计算机或网络设置。回调是跨域回调,但是所有的数据都接收到Winform中显示出来,就会出现异常。

该异常为致命异常,并出现 Windows 消息“App.. has stop working”。

编辑 1:

public void OpenFormCallback(IAsyncResult ar)
{
    // 'this' is a Winform  
    this.BeginInvoke(new DelegateVoid(SetDataSource));
}

通常它可以工作,现在在特殊情况下存在非常快速的网络连接,这可能是尚未创建句柄的原因。刚刚意识到这一点。

我应该试试:

public void OpenFormCallback(IAsyncResult ar)
    {
        // 'this' is a Winform  
        while (!this.IsHandleCreated) { }
        this.BeginInvoke(new DelegateVoid(SetDataSource));
    }

?冒着永恒循环的风险?

编辑 2:我试过了:

public void OpenFormCallback(IAsyncResult ar)
    {
        // 'this' is a Winform  
        if (IsHandleCreated) { CreateHandle() }
        this.BeginInvoke(new DelegateVoid(SetDataSource));
    }

但是主窗体没有显示,它进入状态“没有响应”。

【问题讨论】:

  • 代码中是否有一个地方可以调用Control.Invoke?或者你不确定它在哪里被调用?

标签: winforms exception callback


【解决方案1】:

在从回调中调用 invoke/BeginInvoke 之前添加检查 yourform.IsHandleCreated

【讨论】:

    【解决方案2】:

    试试这个:

    public void OpenFormCallback(IAsyncResult ar)
    {
        while (!this.IsHandleCreated) { Application.DoEvents(); }
        this.BeginInvoke(new DelegateVoid(SetDataSource));
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2012-11-03
      • 2011-05-30
      • 1970-01-01
      • 2011-02-25
      • 2012-01-24
      • 1970-01-01
      相关资源
      最近更新 更多