Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke;仅在窗体第二次打开时发生_C#_Multithreading_Winforms_Delegates - Fatal编程技术网

C# &引用;在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke;仅在窗体第二次打开时发生

C# &引用;在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke;仅在窗体第二次打开时发生,c#,multithreading,winforms,delegates,C#,Multithreading,Winforms,Delegates,我正在开发的应用程序是一个现有应用程序的插件,第一次运行插件时一切都很好。但是,当我第二次打开插件时,我发现错误: 未处理InvalidOperationException-在创建窗口句柄之前,无法对控件调用Invoke或BeginInvoke 我了解竞争条件,从我读到的所有内容来看,在HandleCreated为真之前尝试访问表单元素时会发生此错误,但我无法理解为什么只有在第二次打开插件时才会发生此错误 这是插件代码。调用SetProgressBar()时出错: 这是我的主要表格: p

我正在开发的应用程序是一个现有应用程序的插件,第一次运行插件时一切都很好。但是,当我第二次打开插件时,我发现错误:

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

我了解竞争条件,从我读到的所有内容来看,在
HandleCreated
为真之前尝试访问表单元素时会发生此错误,但我无法理解为什么只有在第二次打开插件时才会发生此错误

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

这是我的主要表格:

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

我猜了一点,但不久前我遇到了同样的问题

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

m_JoinThread.Start();
这会立即启动线程并在某个地方调用
Invoke
。此时,表单尚未完全初始化。
将代码移动到加载事件:

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

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

如果添加
mainForm.Dispose(),是否会发生这种情况
mainForm.ShowDialog()之后?奇怪的是,您的
MainForm
在定义代码中变成了
ZigbeeJoinForm
?除非您的
MainForm
继承
ZigbeeJoinForm
delegate
是一个不能用作变量名的关键字,但您的这一代码行是一个例外<代码>SetProgressCallback委托=新建SetProgressCallback(SetProgressBarControl)我认为这段代码在第一次运行时就会失败,我可以理解为什么它会失败,但奇怪的是,你说第一次运行就可以了。这在
public ZigbeeJoinForm_Load()
{
    m_JoinThread= new Thread(new ThreadStart(GetJoinData));
    m_JoinThread.Start();
}