我有一个名为" 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表单的新实例,或者是否可以通过它然后将控制/所有权返回给主类?
谢谢