none
是否只有System.Threading.Thread能被中止(Abort)? RRS feed

  • 一般討論

  • IDE: VS2010 Pro

    OS: XPPro

    Framework: 4

    自從用了BackgroundWorker後就比較少用Thread

    但最近在BackgroundWorker上遇到一個問題,

    就是在BackgroundWorker_DoWork()裡有行程式碼是在等待某個裝置回傳結果

    但因為該裝置一直沒有傳回結果,造成這個BackgroundWorker一直停在這一行上面。

    想要利用CancelAsync()才發現並無法中止,

    Google了一下,才知道屬於ThreadPool的都不能被中止,像Task也不能被中止

    不知道這概念對不對?

    如果沒錯的話,那是否只能回頭用Thread的方式了?還是有其它解法?

    若BackgroundWorker能達到最好,

    因為啟動時需將某些Control的Enabled設為False,當執行完成才回復,所以BackgroundWorker最符合我的需求。

     

    謝謝

             Howard

    2011年5月11日 上午 06:07

所有回覆

  • BackgroundWorker中止的方式可以參考

    http://www.dotblogs.com.tw/billchung/archive/2009/05/30/8597.aspx

    在等待回應方面, 你需要為其加上 receive timeout, 然後在 timeout execption中做處理


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年5月11日 上午 06:51
    版主
  • 感謝Bill Chung的回覆

    不過CancellationPending並不適用在執行緒停在某個指令上的狀況(我的狀況即是如此)

    舉個例子來說,若執行緒中有個類似Thread.Sleep(100000)的指令

    那麼當程式跑到這一行時,就有點像停住的狀況,此時若下CancelAsync()

    該執行緒並無法被取消,只有等該行完成後,才有機會去判斷CancellationPending是否該取消

    Thread.Abort()則能在等待時亦能停止該執行緒(當然這可能造成資源沒正常被清除)

    Google了很久,發現國外的論壇都不太建議直接Abort()的方式。

    我想我目前最好的作法,還是當CancellationPending為True時,先結束等待裝置的回應,如此BackgroundWorker就能正常結束了。問題也就解決了。

    當初發文的想法,是想知道BackgroundWorkder及Task能否被強制關閉(類似Thread.Abort())

    如今知道不行,這篇就沒有必要繼續了。就此結束。

    2011年5月11日 上午 08:31
  • 您可以看看在等待某個裝置回傳結果的呼叫有沒有辦法設定timeout? 如果沒有辦法, 可以考慮利用執行緒查看裝置有沒有傳回結果, 如果一直沒有結果, 則將執行緒結束
    2011年5月11日 上午 08:45