【问题标题】:"Invoke or BeginInvoke cannot be called on a control until the window handle has been created" only occurs the second time form opens“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”仅在第二次打开表单时发生
【发布时间】:2013-07-11 20:55:43
【问题描述】:

我正在开发的应用程序是现有应用程序的插件,第一次运行插件时一切正常。但是,当我第二次打开插件时,我得到了错误:

InvalidOperationException 未处理 - 在创建窗口句柄之前,无法对控件调用 Invoke 或 BeginInvoke。

我了解竞争条件,从我所阅读的所有内容来看,在 HandleCreated 为真之前尝试访问表单元素时会发生此错误,但我无法弄清楚为什么仅在第二次打开插件时才会发生这种情况。

这是插件代码。调用SetProgressBar()时出现错误:

    private MainForm mainForm;

    public void StartPlugin()
    {
        mainForm  = new MainForm (this);
        mainForm .ShowDialog();
    }

    public bool GetJoinEnabled()
    {
        mainForm.SetProgressBar(3);
    }

这是我的主要形式:

    private Thread m_JoinThread;
    private JoinPlugin m_Join;

    public MainForm(JoinPlugin zig)
    {
        m_Join = zig;
        InitializeComponent();
        m_JoinThread= new Thread(new ThreadStart(GetJoinData));
        m_JoinThread.Start();
    }

    private void GetJoinData()
    {
       //Get enable join data
        bool result = m_Join.GetJoinEnabled();
    }

    public void SetProgressBar(int value)
    {
        SetProgressCallback del = new SetProgressCallback(SetProgressBarControl);
        this.Invoke(del, value);
    }

    private void SetProgressBarControl(int value)
    {
        progressBar.Value = value;
    }

【问题讨论】:

  • mainForm.ShowDialog();后面加mainForm.Dispose();会不会出现这种情况?
  • 你的MainForm在定义代码中变成ZigbeeJoinForm很奇怪?除非你的 MainForm 继承 ZigbeeJoinForm
  • delegate 是一个不能用于变量名的关键字,但你的这个代码行是一个例外? SetProgressCallback delegate = new SetProgressCallback(SetProgressBarControl);
  • 我认为这段代码在第一次运行时会失败,我能理解为什么会失败,但奇怪的是你说第一次运行就可以了。
  • 覆盖在this question

标签: c# multithreading winforms delegates


【解决方案1】:

我猜了一下,但我前段时间遇到了同样的问题。

您正在表单构造函数中启动一个线程:

m_JoinThread.Start();

这会立即启动线程并在某处调用Invoke。此时,窗体还没有完全初始化。
将代码移至Load 事件:

public ZigbeeJoinForm_Load()
{
    m_JoinThread= new Thread(new ThreadStart(GetJoinData));
    m_JoinThread.Start();
}

这样可以确保表单完全初始化,然后调用Invoke 是安全的。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2023-03-23
    相关资源
    最近更新 更多