C#為什麼不能強行終止執行緒
不知道是c#設計疏忽還是我沒找到方對,.net一直無法強行執行緒子執行緒的操作
不知道大家注意沒有,如果子執行緒裡有 死迴圈(有時間必須用迴圈)或子執行緒在進行一個阻塞式的操作,如影響佇列裡的訊息,那麼不能主執行緒用什麼方式終止子執行緒都沒門,
this.thread.Suspend();
this.thread.Abort()
通通不管用,得呼叫win32api去強行終止,我的媽呀.net又把你趕回win32時間了
Abort() 方法也只是建議子執行緒終止,而不是無條件強行終目,這個不好,比如應用程式要退出,子執行緒結束不了會一直駐留記憶體exe都不會退出程序,有什麼辦法強行終止子執行緒哈,不要說類似於(不要用死迴圈,無意義之類的話,那對阻塞式的操作怎麼說呢)
這一句的時候把執行緒阻死了 System.Messaging.Message m = q.Receive();
不管等多少,執行緒都是死的
暈,簡單點,把執行緒設定為後臺執行緒不就得了,還要弄個你死我活的,找不到解決方案
後臺執行緒,在你程式關閉的時候,它也會自動銷燬的
你的程式程式碼設計得有點問題
可以試試在退出的時候用
System.Environment.Exit(System.Environment.ExitCode);
Application.Exit();
還用在那些執行緒開始前,使用它的屬性IsBackground,好像是這個,把它設為true,這樣在你程式結束的時候,執行緒也會自動結束
對什麼啊
程式設計中的情況有太多種了。比如UDP通訊
比如我的軟體中有一個主的等待執行緒,接收到一個有效訊息後,就會分配一個埠,開啟一個新的監聽執行緒。
客戶端會不斷的向這個埠傳送心跳包。
如果超時就認為是客戶端斷開了連線。客戶端就要重新去主執行緒去申請埠。
當然我也要強行結束沒有心跳包發來的 執行緒,關閉埠。怎麼可能不斷的開執行緒不銷燬呢。
如果等待連線的執行緒超時,它自己應該主動關閉,而不是等著別人關閉它。 如果你遇到無法協作(業務邏輯設計上可以看出會死迴圈)的執行緒,聰明的辦法不是去想辦法終止它,而是應該把這類程式碼從自己的系統中刪除。 |
來源:英超直播 |