如何在C#中强制创建Winform句柄

Mic*_*uer 3 .net c# handle invoke

我收到以下运行时错误消息

在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke.

这就是我的想法.我的winform构造函数正在创建一些对象,其中一个对象接收异步TCP/IP数据.总而言之,我有一些事件代理,允许接收网络数据的类从Winform调用例程将数据打印到文本框.这是我可以看到收到的内容.我可以看到数据立即收到.这是在winform构造函数完成之前发生的.

我读了一遍,在创建句柄之前你不能调用winform或winform组件.我怀疑这是我违反的.据说有一个强制这个的功能.我尝试将以下代码添加到我的winform构造函数中,以便在创建接收TCP/IP数据的类之前强制创建.但是,错误仍然存​​在.

InitializeComponent();
this.CreateControl();
this.HistoryBox.CreateControl();
Run Code Online (Sandbox Code Playgroud)

以下是我的winform委托的代码,以防它有用:

    public void Print_Console_Message(string message)
    {
        Console_Output.Enqueue(message);
        this.Invoke(new EventHandler(PrintToConsole));
    }
    private void PrintToConsole(object sender, EventArgs e)
    {
        string message = Console_Output.Dequeue();

        if (message.Length != 0)
        {
            HistoryBox.AppendText(message + "\n" + "\n");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我意识到有一种方法可以检查对象句柄是否已创建并在这种情况下避免调用,但是,我对简单地抑制某些输出不感兴趣.

有谁知道我如何强制句柄或控件创建,以便可以在构造函数完成之前调用委托函数?

MrB*_*lue 10

根据文档,您可以通过获取该.Handle属性来完成此操作.

如果尚未创建句柄,则引用此属性将强制创建句柄.

或者,您可以HandleCreatedInvoke在它被解雇后才能收听事件.

  • 如果uiElement .InvokeRequired == true`,`.Handle`属性将抛出`InvalidOperationException`.最好使用uiElement .CreateControl()`; 方法.它对代码修改无动于衷. (2认同)
  • 如果“InvokeRequired”为“true”,那么我预计在调用方法时会抛出相同的异常。`CreateControl()` 确实读起来好一些,但不能保证创建句柄。 (2认同)