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

标签 c# .net invoke handle

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

Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

这是我认为正在发生的事情。我的 winform 构造函数正在创建一些对象,其中之一接收异步 TCP/IP 数据。长话短说,我有事件委托(delegate),它允许接收网络数据的类从 Winform 调用例程以将数据打印到文本框。这样我就可以看到收到了什么。我可以看到立即收到数据。这发生在 winform 构造函数完成之前。

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

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

以下是我的 winform 委托(delegate)的代码,以防有帮助:

    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");
        }
    }

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

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

最佳答案

根据documentation您可以通过获取 .Handle 属性来做到这一点。

If the handle has not yet been created, referencing this property will force the handle to be created.

或者,您可以监听 HandleCreated 事件,并在它被触发后只​​监听 Invoke

关于c# - 如何在 C# 中强制创建 Winform 句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23123082/

相关文章:

c# - 包含空格的 Process.Start 参数在 XP 上有问题吗?

c# - 在 C# 中使用字符串调用方法时出现 "Object does not match target type"

c# - 当使用 Parallel BeginInvoke 时有效而 Invoke 无效 - c# 4.0

c# - 来自 C# 代码的 Javascript 仅在 Google Chrome 中刷新

c# - 如何通过反射代码(c#)设置可空类型?

.net - 我的程序需要管理员权限才能打开文件是否正常?

.NET 元组和等于性能

c# - 加速反射调用 C#/.NET

c# - 生成用于在 Visual Studio 2012 中创建 XmlSerializers.dll 的脚本

c# - 命名约定 : Guidelines for verbs/nouns and english grammar usage