如何在C#中强制创建Winform句柄
本文关键字:创建 Winform 句柄 | 更新日期: 2023-09-27 17:58:52
我收到以下运行时错误消息
在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke。
我的winform构造函数正在创建一些对象,其中一个对象接收异步TCP/IP数据。长话短说,我有一些事件委托,允许接收网络数据的类从Winform调用例程,将数据打印到文本框中。这样我就可以看到收到了什么。我可以看到数据立即被接收。这种情况发生在winform构造函数完成之前。
我仔细阅读了一遍,在创建了winform或winform组件的句柄之前,您不能调用它。我怀疑这就是我所违反的。据推测,这是一种强制作用。在创建接收TCP/IP数据的类之前,我尝试将以下代码添加到我的winform构造函数中以强制创建。然而,错误仍然存在。
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");
}
}
我意识到有一种方法可以检查对象句柄是否已创建,并在这种情况下避免调用,但是,我对简单地抑制一些输出不感兴趣。
有人知道我如何强制创建句柄或控件,以便在构造函数完成之前调用委托函数吗?
根据文档,您可以通过获取.Handle
属性来完成此操作。
如果尚未创建句柄,则引用此属性将强制创建句柄。
或者,您可以侦听HandleCreated
事件,并且在它被激发后仅侦听Invoke
。