簡體   English   中英

在表單運行線程時關閉主應用程序

[英]Closing main app while form is running a thread

我有一個C#Windows應用程序,在其中創建某個類的實例,在該類中,它具有一個成員,該成員是窗口表單,並且此表單具有一個按鈕,當我單擊它時,我將打開一個可以運行工作線程的新表單,可以說:

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); 當我嘗試它時,它運行順利。 所以,現在我還有一個問題,為什么會這樣?

我嘗試注冊到ClosingClosedFormClosing事件並設置m_stopped = true但是沒有被調用。

編輯:由於@drf建議該線程是前台線程,因此該應用在運行時被阻止,因此添加:

worker.IsBackground = true;

修復。

我認為要關閉應用程序,您應該使用Application.Exit Method

它通知所有消息泵它們必須終止,然后在處理完消息后關閉所有應用程序窗口。

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

您的線程當前是前台線程,它將阻止進程退出直到線程完成。 http://msdn.microsoft.com/zh-CN/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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM