簡體   English   中英

取消正在調用外部進程的后台工作者

[英]Cancel background worker which is calling external process

我已經為需要執行的項目創建了一個TelNet服務器,該服務器工作正常,但是,當客戶端連接到服務器時,它需要連接到數據庫,當連接信息正確和/或調用數據庫時,同樣可以正常工作數據庫不會花費太長時間。

如果數據庫調用花費很長時間(通常是由於憑據不正確或存儲過程優化不佳),則服務器將崩潰並顯示Windows錯誤消息(即不可調試),我知道這是底層TCP系統的介入,這很好。 為了解決這個問題,我將所有數據庫調用都放到BackgroundWorkers ,以便服務器(和客戶端)繼續工作,但是如果此過程顯然花費太長時間,則需要終止該過程。

我知道使用BackgroundWorker.CancellationPending ,但是由於這是對數據庫的單個方法調用(通過和外部DLL),因此永遠不會進行檢查。 我在其他地方看到過的自制方法也存在同樣的問題。 我看到的另一個選項是使用Thread.Abort() ,但我也知道這是不可預測的且不安全的,因此最好不要使用它。

有人對如何做到這一點有任何建議嗎?

這里的問題是外部DLL控制着等待。 通常,您可以取消ADO.NET連接或套接字連接,但這在這里不起作用。

兩種可靠的方法:

  • 將連接移到可以終止的子進程中。 殺死是安全的(與Thread.Abort相反),因為該進程的所有狀態都同時消失了。
  • 對應用程序進行結構設計,以便在取消連接的情況下僅忽略連接嘗試的結果,並繼續運行其他應用程序。 您只需讓掛起的連接在后台嘗試“懸掛”,然后在碰巧稍后返回時丟棄其結果。

暫無
暫無

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

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