C#线程与"请等待"形成

时间:2016-07-21 11:27:08

标签: c# multithreading forms

我有一个名为" Wait"在整个程序中显示和更新。它显示正在执行的当前任务以及正在完成的任务中的阶段。 我最近开始学习线程,并试图将它们实现到我的程序中。但是,我似乎遇到了关于我的等待表格的问题。我可以将表单传递给线程,并且线程中的任务将在开头使用Wait.Show(),更新等待的内容,并在结尾处使用Wait.Hide()。 (我不会在每项任务完成后使用Wait.Close(),因此我不必为每项任务创建一个新的等待表单实例。)

我的问题是这个。我的测试运行会将Wait表单成功传递给线程,在需要时更新它,并在完成后隐藏它。但是,当我单击“退出”按钮时,我无法在等待表单中取消(?),因为我收到以下错误。

  

跨线程操作无效:控制' Frm_Wait'从a访问   除了创建它的线程以外的线程。

我测试的代码如下:

    Excel.Application ObjApp = new Excel.Application();
    Specialised Modules = new Specialised();
    ErrorHandling EH = new ErrorHandling();
    Frm_Wait Wait = new Frm_Wait();

    private void BtnTest_Click(object sender, EventArgs e)
    {
        try
        {
            Thread RCCThread = new Thread(() => UpdateRCCountsThread(Wait));
            RCCThread.Start();
        }
        catch (Exception Ex)
        {
            MessageBox.Show(Ex.Message);
        }
    }


    public void UpdateRCCountsThread(Frm_Wait Wait)
    {
        try
        {
            string RCCountsSource = ResourceDetails.MainResources(this, EH, "RCCounts");
            Wait.Show();

            bool check = Modules.UpdateRCCounts(this, ObjApp, EH, Wait);
            if (check == true)
            {
                //Record completed task to LogFile.
                Thread MsgTaskComplete = new Thread(() => MsgUpdateThread(this, ObjApp, EH, 1, 10, Path.GetDirectoryName(RCCountsSource), Path.GetFileName(RCCountsSource), "", 0, 0, 0, 0, "RC Counts File updated.", "Y"));
                MsgTaskComplete.Start();
            }
            else
            {
                MessageBox.Show("An Error occurred, Please Check LogFile.");
            }
            Wait.Hide();
        }
        catch (Exception URC)
        {
            Thread MsgTaskCatch = new Thread(() => MsgUpdateThread(this, ObjApp, EH, 4, 1, "", "", "", 0, 0, 0, 0, "BtnTest_Click Clicked - Error Occurred. System says: " + URC.Message, "N"));
            MsgTaskCatch.Start();
            MessageBox.Show("An Error Occurred" + Environment.NewLine + URC.Message);
        }
    }

抛出错误的Exit按钮的代码部分是这个;

            if (Wait != null)
            {
                Wait.Close();
                Wait = null;  //this is the line that causes the error.
            }

有人知道我哪里错了吗? 我是否必须为每个线程创建一个Wait表单的新实例,或者是否可以通过它然后将控制/所有权返回给主类?

谢谢

0 个答案:

没有答案