【问题标题】:Disposing a background worker处理后台工作人员
【发布时间】:2012-06-02 23:26:56
【问题描述】:

在我完成 DoWork 事件内的处理工作后是否有必要释放后台工作人员,或者作为托管对象最终会自动被释放?

以前,我在timer_elapsed 中执行一些功能,即每三十秒执行一项任务。 现在,我在 BackGround Worker 的 DoWork 事件中进行相同的处理。如何在每 30 秒后循环执行此 bgWorker 事件(例如)bgworker.RunWorkerAsync();

如果我把这个 bgWorker.RunWorkerAsync() indie timer_elapsed 放在每个定时器过去后如何处理它?

【问题讨论】:

  • 如果您还需要它,为什么要丢弃它?
  • 为什么要使用后台工作者?计时器似乎更适合基于间隔触发操作
  • @Aybe:我担心计时器应该运行无限次,即每隔 30 秒左右运行一次,直到我使用它的 windows service 关闭。那么,我该在哪里处理呢?
  • @BrokenGlass:这是我之前的帖子,我决定使用Background worker 代替主线程。 stackoverflow.com/questions/10793278/…

标签: c# asynchronous backgroundworker


【解决方案1】:

是否有必要在...之后处理掉后台工作人员

没有。 BackgroundWorker 确实实现了 IDisposable 接口,但仅作为从 Component 继承的一揽子功能。它没有任何目的。

如果我把这个bgWorker.RunWorkerAsync() 放入timer_elapsed

你是否应该这样做值得怀疑。但如果你这样做了,只需每次创建一个新的 Backgroundworker。

Backgroundworker 是一个相对“轻”的对象,它不包含任何资源。线程是从 ThreadPool 借来的。

如果您是校长的忠实拥护者,您可以在创建新的之前对旧的调用 Dispose()。但这不会有太大的不同。

【讨论】:

  • 为每个背景创建一个新线程timer_elapsed 对我来说似乎有点过头了,但我认为如果持有的资源非常少也没关系。
  • 正如 Henk 所说,您实际上并没有(通常)创建线程,只是从线程池中借用它们。
  • HenkHolterman,对于任何看到这个的人。您的评论可能在无意中具有误导性。 backgroundworker 在另一个线程上运行操作,但仅在被调用时。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多