2015-10-28 44 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