2015-10-28 37 views
0
Loading loadingForm = new Loading(); 
     private void btnSend_Click(object sender, EventArgs e) 
     { 
      Thread loading = new Thread(new ThreadStart(startLoading)); 
      loading.Start(); 
      new Thread(() => sendEmail() 
      ).Start(); 
     } 
     public void closeLoading() 
     { 
      if (loadingForm.InvokeRequired) 
       loadingForm.Invoke((MethodInvoker)delegate() 
       { 
        closeLoading(); 
       }); 
      else 
       loadingForm.Close(); 
     } 
     public void startLoading() 
     { 
      if (loadingForm != null) 
       Application.Run(loadingForm); 
      else 
      { 
       loadingForm = new Loading(); 
       Application.Run(loadingForm); 
      } 
     } 

基本上这个代码应该是打开一个线程的加载窗体并在另一个线程中执行一些其他进程。关闭后打开窗体导致崩溃

但是我的应用程序崩溃,如果我关闭一次加载表单完成加载后,再次按下“发送”按钮。它说确保表格仍然存在,并且没有发布。所以在StartLoading中,我只是检查我的表单是不是“null”。它永远不会涉及其他部分。如果我做loadForm = new Loading();在开始加载时没有其他任何东西,它将打开窗体并停留在那里,永远不会关闭。 closeLoading从第二个线程中的进程调用。

我该如何解决这个问题?我不断收到错误,以确保如果我的表格没有公布

编辑:

我不知道我是不是足够清晰。

关闭部分工作。因此,如果我打开加载表单,它会打开,然后在完成时关闭。我第二次打开加载表单后发生崩溃部分。它说上面的消息。

+0

你不想拥有多个UI线程。你应该有一个UI线程来处理你的整个UI。 – Servy

+0

您尝试重新使用'loadingForm'变量时没有可以想象的一点。此代码也是非常危险的,您可以调试[此问题](http://blogs.msdn.com/b/dsui_team/archive/2012/10/31/debugging-windows-forms-application-hangs-during- systemevents.userpreferencechanged.aspx)。这是为了吓跑你这样做。工作者线程必须*只*调用sendEmail(),没有别的。使用BackgroundWorker,它的RunWorkerCompleted事件很方便关闭窗口。 –

+0

只要您在代码中维护一个对加载表单的引用,它就不会被垃圾收集器释放。您应该隐藏表单或在处理表单后将表单设置为空。 – martijn

回答

2

而不是我使用任务的线程,并打开加载屏幕作为对话框来防止与主窗体的交互。

Loading loadingForm = new Loading(); 
btnSend_Click(object sender, EventArgs e) 
{ 
    new Task(() => sendEmail() 
    ).Start(); 
    startLoading(); 
} 
public void closeLoading() 
{ 
    if (loadingForm.InvokeRequired) 
    { 
     loadingForm.Invoke((MethodInvoker)delegate() 
     { 
      closeLoading(); 
     }); 
    } 
    else 
    { 
     loadingForm.Hide(); 
    } 
} 
private void startLoading() 
{ 
    if (loadingForm == null) 
    { 
     loadingForm = new Loading(); 
    } 
    loadingForm.ShowDialog(); 
} 


private void sendEmail() 
{ 
    Thread.Sleep(1000); 
    closeLoading(); 
} 
+0

谢谢,这将做:) – user5014677