【发布时间】: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); -
我认为这段代码在第一次运行时会失败,我能理解为什么会失败,但奇怪的是你说第一次运行就可以了。
标签: c# multithreading winforms delegates