簡體   English   中英

如何以正確的方式處理BackgroundWorkers

[英]How to dispose BackgroundWorkers the right way

我有一個運行BackgroundWorker的Windows服務,我想知道當我停止Windows服務時我是否做得對。

是否足夠:

  1. BackgroundWorker1_DoWork方法完成(我現在有一個while循環,做一些任務)
  2. 將包含對BackgroundWorker的引用的變量設置為null

是否需要調用某種Dispose()方法(同樣, Timer類有Timer.Dispose(); )?

坦率地說,當你停止你的Windows服務時 - 它真的沒關系。 您的win32進程已終止,因此不一定要清理您的IDisposables。 任何非托管資源都將具有仍將運行的終結器。

也就是說,擁有一個類級別的后台工作程序是正常的,它可以在e服務類執行時被處理掉。 沒必要,但干凈總是好的。

由於BackgroundWorker實現了IDisposable ,因此在完成后應該將其處理IDisposable

你提到這是在Windows服務中,因此有一些事情在這里發揮作用。 停止Windows服務時,從ServiceBase實現中的OnStop方法返回大約30秒。 如果您未在此時間內返回,Windows會向用戶報告無法停止該服務。 你應該做的是向BackgroundWorker發出信號,要求你停止它(使用CancelAsync機制),處理worker,然后退出。 但是,由於您正在停止服務,因此無論如何都會終止整個過程並不重要,包括在其中運行的所有線程。

如果您按照自己的意思去做並等待工作人員完成(在OnStop方法中),您的服務可能會對用戶顯示為已掛起,因為Windows會說它無法阻止它,並且該過程仍然是運行。

正確的方法是讓工作線程干凈地完成它正在做的事情。

這通常可以通過擁有一個共享標志\\ waithandle \\來完成,可以用來與工作線程(來自主線程)進行通信,它應該退出它正在做的事情,這自然會導致工作線程從其中移動堆疊和蒸發。 工作線程應該定期檢查“標志”以查看它是否需要退出(例如在循環中),並且主服務線程可以在需要關閉時發出標志信號。 然后主線程等待工作線程退出,例如通過在工作線程上調用join。

BackgroundWorker是IDisposable,因此您應該在不再需要時將其丟棄。

BackgroundWorkers還有一個CancelAsync方法,可以將CancellationPending屬性更改為true。 您可以在DoWork功能中檢查它,以便停止運行。

暫無
暫無

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

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