執行緒關閉 主線程和子執行緒的關閉

2021-07-29 22:13:59 字數 2457 閱讀 5016

今天寫執行緒,再網頁上找了些關閉執行緒的栗子,給大家整理一下~~~

多執行緒程式的開發中,啟動了多個執行緒的程式在關閉的時候卻出現了問題,如果程式退出的時候不關閉執行緒,那麼執行緒就會一直的存在,但是大多啟動的執行緒都是區域性變數,不能一一的關閉,如果呼叫thread.currentthread.abort()方法關閉主線程的話,就會出現threadabortexception 異常,因此這樣不行。

後來找到了這個辦法:

thread.isbackground 設定執行緒為後台執行緒。

msdn對前台執行緒和後台執行緒的解釋:託管執行緒或者是後台執行緒,或者是前台執行緒。後台執行緒不會使託管執行環境處於活動狀態,除此之外,後台執行緒與前台執行緒是一樣的。一旦所有前台執行緒在託管程序(其中 .exe 檔案是託管程式集)中被停止,系統將停止所有後台執行緒並關閉。通過設定 thread.isbackground 屬性,可以將乙個執行緒指定為後台執行緒或前台執行緒。例如,通過將 thread.isbackground 設定為 true,就可以將執行緒指定為後台執行緒。同樣,通過將 isbackground 設定為 false,就可以將執行緒指定為前台執行緒。從非託管**進入託管執行環境的所有執行緒都被標記為後台執行緒。通過建立並啟動新的 thread 物件而生成的所有執行緒都是前台執行緒。如果要建立希望用來偵聽某些活動(如套接字連線)的前台執行緒,則應將 thread.isbackground 設定為 true,以便程序可以終止。

所以解決辦法就是在主線程初始化的時候,設定:

thread.currentthread.isbackground = true;

這樣,主線程就是後台執行緒,在關閉主程式的時候就會關閉主線程,從而關閉所有執行緒。

但是這樣的話,就會強制關閉所有正在執行的執行緒,所以在關閉的時候要對執行緒工作的結果儲存。

c#程式的幾種退出

版本1:

在客戶關閉程式時,主線程直接關閉,不考慮子執行緒。

問題:任務管理器中,主程式程序還在執行(在等子執行緒結束,而子執行緒做成了while(1)。)

版本2:

在主線程關閉處理時,首先關閉子執行緒。**如下:

[csharp]view plain

copy

print?

/// 

/// 停止掃瞄線程

/// 

/// 操作模組的提示性訊息

private

void stopscanthread()  

this.showstatus("正在關閉掃瞄埠...");  

if (monitor != null)  

if (workthread[1] != null)  

}  this.showstatus("資料採集已停止...");  

cursor.current = cursors.arrow;  

}  

/// /// 停止掃瞄線程

///

/// 操作模組的提示性訊息

private void stopscanthread()

this.showstatus("正在關閉掃瞄埠...");

if (monitor != null)

if (workthread[1] != null)

}this.showstatus("資料採集已停止...");

cursor.current = cursors.arrow;

}

問題:主程式關不掉,類似於宕機狀。

版本3:改進一下,在程式啟動時強制停止同名程序。在program.cs的main方法中實現,**如下:

[csharp]view plain

copy

print?

#region 殺死由於上次關閉軟體而未停掉的程序(多執行緒的***)

process processes = system.diagnostics.process.getprocesses(); //獲得所有程序

foreach (process p in processes)  

}  #endregion

#region 殺死由於上次關閉軟體而未停掉的程序(多執行緒的***)

process processes = system.diagnostics.process.getprocesses(); //獲得所有程序

foreach (process p in processes)

}#endregion

版本4:(終結版本)

c#多執行緒程式設計時,thread物件有個isbackground屬性,設定為true即可,在主線程關閉時,子執行緒隨之關閉,速度很快。

[csharp]view plain

copy

print?

workthread.isbackground = true;  

** :



主線程和子執行緒

子執行緒通過 handlerthread的thread.getlooper 繫結,在主線程的handler的handlermessage中呼叫threadhandler.sendmessagedelay msg,1000 向子執行緒傳送訊息。在子執行緒中通過handler.sendmessagede...

主線程和子執行緒

主線程負責管理由它建立的子執行緒,建立 啟動 掛起 停止等。主線程通過發訊息的方式管理子執行緒,例如,給子執行緒傳送start 訊息,子執行緒啟動,子執行緒執行入口的run 方法。thread有下面兩個構造方法 thread runnable target,string name thread ru...

主線程和子執行緒總結

執行結果 從上面可以看到 如果主線程和子執行緒是並行的,雖然都是用while 1 但是倚靠 cpu的排程,主線程和子執行緒都有機會得到執行。如果要在子執行緒裡面改變主線程裡面的資料,就在 pthread create 裡面的最後 乙個引數使用傳位址呼叫 void c,否則使用傳值呼叫 void c ...