Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何将背景线程绑定到对象的生存期?_.net_Multithreading_Garbage Collection - Fatal编程技术网

.net 如何将背景线程绑定到对象的生存期?

.net 如何将背景线程绑定到对象的生存期?,.net,multithreading,garbage-collection,.net,Multithreading,Garbage Collection,我想创建一个对象拥有的背景线程。当该对象不再需要时,其背景线程也不再需要 我目前拥有的伪代码: ResetEvent _isCanceled ResetEvent _hasWork ThreadSafeQueue _workItems Init() new BackgroundThread(ThreadLoop).Start() AddWork(work) _workItems.Enqueue(work) _hasWork.Set() Dispose() _isCancel

我想创建一个对象拥有的背景线程。当该对象不再需要时,其背景线程也不再需要

我目前拥有的伪代码:

ResetEvent _isCanceled
ResetEvent _hasWork
ThreadSafeQueue _workItems

Init()
  new BackgroundThread(ThreadLoop).Start()

AddWork(work)
  _workItems.Enqueue(work)
  _hasWork.Set()

Dispose()
  _isCanceled.Set()

ThreadLoop()
  while(!_isCanceled)
    if(_hasWork)
      Execute(_workItems.Dequeue())
    if(_workItems.IsEmpty)
      _hasWork.Reset()
    WaitHandle.WaitAny(_isCanceled, _hasWork)
问题是,如果有人(当然不是我)忘记调用Dispose(),线程将永远不会停止。我对Finalize的理解是,您不能引用任何成员,因为您必须假设它们已经为null


那么,如果拥有的对象是或被gc-ed,我如何停止后台线程呢?

Finalize正是这样做的地方。只需检查它是否为空。

Finalize是执行此操作的正确位置。只需检查它是否为null。

那么,如果isCanceled为null,您该怎么办?让背景线程继续运行?对我来说,这闻起来像是一个内存泄漏……如果它是空的,那么它就被收集起来了,tread应该结束存在。另一种方法是让WeakReference指向线程的创建者,并偶尔检查它。我想使用WeakReference是一种方法。虽然这意味着我需要让线程偶尔唤醒一次。虽然我想这比冒着让线程永远存在的风险要好。只需添加对WeakReference to creators的while条件检查,那么如果_isCanceled为null,你会怎么做?让背景线程继续运行?对我来说,这闻起来像是一个内存泄漏……如果它是空的,那么它就被收集起来了,tread应该结束存在。另一种方法是让WeakReference指向线程的创建者,并偶尔检查它。我想使用WeakReference是一种方法。虽然这意味着我需要让线程偶尔唤醒一次。虽然我想这比冒着让线程永远存在的风险要好。只需添加对WeakReference to creator的while条件检查