我的C#app有很多表单可以执行各种任务。为了简单起见,我有一个静态类FormsCollection
,其中保留了每个其他表单的实例,以便在一个地方显示和隐藏它们。
现在我得到了那个经典debug time "Cross-thread" error。我尝试通过以下方式修复它:
public class FormsCollection : Control // inherited from Control only to be
// able to call "this.Invoke"
{
public delegate void ShowFormDelegate(Form form);
public static Main mainForm;
// and many other forms...
public void ShowForm(Form form)
{
if (form.InvokeRequired)
{
ShowFormDelegate delegateFunc = new ShowFormDelegate(ShowForm);
this.Invoke(delegateFunc, new object[] { form });
}
else
{
previousForm = currentForm;
currentForm.Hide();
currentForm = form;
currentForm.Show();
}
}
}
在用户/来电表单中,我只创建FormsCollection
对象并调用ShowForm
方法(几乎100个此类调用):
FormsCollection f = new FormsCollection();
f.ShowForm(FormsCollection.mainForm);
在经历了所有这些考验之后,我得到的是同样的错误出现在与以前完全相同的位置!多么讽刺! :) 我究竟做错了什么?请帮帮我....
答案 0 :(得分:0)
this slightly irrelevant page我很难找到这个问题的答案。以下是任何正在寻找解决此问题的困难程序员的更新代码:
public void Show(Form nextForm)
{
Thread thread = new Thread(
new ThreadStart(() =>
{
PreviousForm.BeginInvoke(
new Action(() =>
{
PreviousForm = CurrentForm;
CurrentForm = nextForm;
PreviousForm.Hide();
CurrentForm.Show();
}
));
}
));
thread.Start();
}
这似乎解决了我面临的跨线程问题,尽管有几种解决方法。它在没有引发任何异常的情况下工作,我已经测试了我的应用程序几乎从形式到形式的所有场景。