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