尽管使用了Invoke()

时间:2017-05-04 05:05:25

标签: multithreading

我的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);

在经历了所有这些考验之后,我得到的是同样的错误出现在与以前完全相同的位置!多么讽刺! :) 我究竟做错了什么?请帮帮我....

1 个答案:

答案 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();
    }

这似乎解决了我面临的跨线程问题,尽管有几种解决方法。它在没有引发任何异常的情况下工作,我已经测试了我的应用程序几乎从形式到形式的所有场景。