在form.show期间显示表单的跨线程操作错误

时间:2013-11-14 03:40:58

标签: c# multithreading winforms

我有一个棘手的问题,我无法解决,也没有我在msdn论坛上问过的人。

我正在使用第三部分产品(来自mitov.com的信号实验室),这是一组.net组件。 我创建了一个Windows窗体应用程序,如果运行它可以正常工作。 我现在想要在另一个表单加载(或显示或激活...)时从另一个表单中显示此表单。

我已经有了另一种形式的示例:这是典型的代码: 我正在从主程序中加载一个表单(SecondForm)...

private void SecondForm_Load(object sender, EventArgs e)
{
     Form _macros = new Macros(this);  //this works perfectly fine
     _macros.show(this);

     //this is where I have no success
     Form _spectrum = new SpectrumScope;
     _spectrum.Show();

}

我从没有显示的表单中得到各种错误,然后是一个关于不实例化_spectrum的异常,关于不允许交叉线程操作的错误,到蓝屏,其中有关于处理器之间没有同步时钟的消息。

如果我在“第二个表单”上放置一个按钮并将显示表单代码添加到click事件中,它可以正常工作。 如果我尝试使用form.activated,或者使用form而不是form.load,则没有区别。 如果我添加时间来表示已显示,然后执行button.performClick,则没有区别。

显然,包含许多组件的表单(以及场景后面的许多线程)不喜欢用户没有打开它的事实。

我对C#很新,我很确定这与线程有关。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用表单加载方法中的强制代码,让.Net为您管理线程。

this.Invoke(new MethodInvoker(() => (new SpectrumScope).Show()));

答案 1 :(得分:0)

嗯,问题是解决的。但是,我真的不知道问题存在的原因。 在频谱形式中,我在第二种形式中引用静态变量。现在,我按如下方式使用它们:

string newFrequency = secondForm.frequency;

这很有效。但是,其中一些变量需要完成:

string newBandWidth = secondForm.bandwidth.substring(2,4);

这是失败的命令。我被告知我需要" new" keywork。

我改变了我的代码提供的字符串,而不需要获取子字符串,现在一切正常。 有人有什么想法吗?