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

时间:2014-04-17 01:34:05

标签: c# .net invoke handle

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

  

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

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

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

InitializeComponent();
this.CreateControl();
this.HistoryBox.CreateControl();

以下是我的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");
        }
    }

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

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

1 个答案:

答案 0 :(得分:8)

根据documentation,您可以通过获取.Handle属性来执行此操作。

  

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

或者,您可以听取HandleCreated事件,并在其被解雇后仅Invoke