作者Peruheru (還在想)
看板Visual_Basic
標題[.NET] 執行緒終止的一問
時間Fri Apr 24 00:51:02 2009
請輸入專案類型(網站專案或者應用程式專案):應用程式專案
因為希望我做的這個程式在執行模擬運算時
整個程式不要像當掉一樣沒有回應
也希望能看到執行的進度
不管是以後給人用還是我自己偵錯時都比較方便觀察
所以我弄了一個執行緒
專門執行這個可能會耗上長時間的運算
然後透過Delegate和判斷Me.InvokeRequired的值
將目前進度,以及要顯示的訊息使用Me.Invoke傳回到Form上顯示給使用者看
(因為原本直接修改控制項的值,會顯示跨執行緒存取的錯誤,
所以在網路上找到這個方法,可以解決這個跨執行緒存取的問題)
然後現在的問題是
假如在執行緒執行時,尚未結束前就關閉程式
就會留下一個沒有關閉的執行緒
還得要打開工作管理員手動關閉這個執行緒(的程式)
我試著在Form的關閉事件中
檢查執行緒的狀態之後,假如為執行中就使用.Abort的方法想關閉執行緒
但是此時就會出現錯誤,發生在我的Delegate連結的Sub中(還是應該要反過來說才對?)
錯誤內容是"無法存取已處置的物件"
看起來應該是表示說,因為我已經把Form1給關閉了
所以沒辦法執行它的Invoke方法?
我上網稍微看了一下關於執行緒的關閉處理
有看到一篇內容是說後面還要加上該執行緒的.Join方法
封鎖該執行緒,會比較容易關閉
但是這樣一來,執行緒好像會卡著無法關閉,雖然不會出現錯誤啦
我想問題沒有解決
應該還是卡在 無法在已關閉的Form上 執行.Invoke方法的問題上
想請問,有什麼方法可以正確的終止整個程式呢?
--
早先在練習寫可以透過TcpClient和TcpHost傳遞訊息的程式時
也是為了讓程式可以順暢點而使用了執行緒
結果也是遇上這個問題,執行緒沒有執行完成會沒法子正常終止
當時還沒有使用Delegate呢,情況單純多了
但是在Form的關閉事件中加入.Abort方法也是無法終止該執行緒
只是當時反正是自己寫有趣的,沒真的去解決這問題
現在不知怎麼解決了...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.163.87
推 Marty:我想可能是該Thread中有其他的物件還沒有正確的釋放.. 04/24 07:55
→ Marty:例如TcpClinet還沒有斷線之類的... 04/24 07:56