2014-09-01 142 views
0

我有一個C#窗口應用程序,我在其中創建了某個類的實例,其中有一個窗口窗體的成員,此窗體有一個按鈕,當我單擊但我打開一個可以運行工作線程的新形式,比方說:當窗體運行線程時關閉主應用程序

public static void Main() 
{ 
    MyClass mc = new MyClass(); 
    mc.ShowForm(); 
} 

在MyClass.cs:

public void ShowForm() 
{ 
    MyFirstForm firstForm = new MyFirstForm(); 
    firstForm.Show(); 
} 
在MyFirstForm.cs

private void myButton_Click(object sender, EventArgs e) 
{ 
    MySecondForm secondForm = new MySecondForm(); 
    secondForm.Show(); 
} 

在MySecondForm.cs:

private void startButton_Click(object sender, EventArgs e) 
{ 
    var worker = new Thread(StartWork); 
    worker.Start(); 
} 

private void stopButton_Click(object sender, EventArgs e) 
{ 
    m_stopped = true; 
} 

private void StartWork() 
{ 
    while(!m_stopped) 
    { 
     //work... 
    } 
} 

當我運行我的應用程序,點擊myButton的,然後單擊startButton,然後退出我的應用程序(我有一個托盤圖標點擊退出時,調用base.Shutdown() ),第二種形式保持懸掛和不響應。

我原來的問題是,什麼是通知第二種形式,它應該關閉和停止正在運行的線程的最佳方式,但在寫這篇文章時,我注意到我可以使用Task.Factory.StartNew(StartWork);,當我嘗試它時,它沒有工作一個順利。 所以現在我有另一個問題,這是爲什麼會發生這種情況?

我試過註冊到Closing,Closed,FormClosing事件和設置m_stopped = true但他們沒有被調用。

編輯: 作爲@drf建議的線程是一個前臺線程因此該應用被阻擋在它運行時,因此添加:

worker.IsBackground = true; 

固定它。

+0

設置其母公司 - '.Show(本)',所有的子窗體應該得到與他們的父母 – Sayse 2014-09-01 06:18:20

+0

關閉你可以跟蹤'形式Closing'事件關閉正在運行的線程。 – Hassan 2014-09-01 06:22:21

+0

會將線程上的['IsBackground'](http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v = vs.110).aspx)屬性設置爲true work ? – drf 2014-09-01 06:28:24

回答

0

您的線程當前是前臺線程,它將阻止進程退出,直到線程結束。 http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v=vs.110).aspx

更改線程啓動代碼這樣:

private void startButton_Click(object sender, EventArgs e) 
{ 
    var worker = new Thread(StartWork); 
    worker.IsBackground = true; 
    worker.Start(); 
} 
+0

感謝@drf已經說過 – ZivS 2014-09-02 13:01:25

+0

太好了。你試過了嗎?如果您願意,請更新您的帖子中的代碼以顯示它?否則,那些一直在使用.NET線程的人會立即得出我有的結論。 – jaket 2014-09-02 15:18:52

0

我覺得收盤應用程序,你應該使用Application.Exit Method

它通知所有消息泵必須終止,然後關閉該消息後,所有應用程序窗口已被處理。

你也可以跟蹤每個表格的FormClosing事件。檢查Thread.IsAlive然後Thread.Abort()或取消關閉。

+0

不,絕對不是,Application.Exit錯過了重要的關閉步驟。 – Sayse 2014-09-01 06:40:48

+0

@Sayse。你的意思是關閉個人表格? – Hassan 2014-09-01 06:43:47

+0

[「Exit方法不會引發Closed和Closing事件..」](http://msdn.microsoft.com/zh-cn/library/ms157894(v = vs.110).aspx),我是肯定還有更多它 – Sayse 2014-09-01 06:46:00

相關問題