BackgroundWorker
スレッド (純粋に Action デリゲートのキュー)を持つオブジェクトがあります。つまり、これは一般的で単純な単一生産者、単一消費者のシナリオです。
BackgroundWorker
単一のプロデューサーが収集されたら、Terminate アクションをスレッドにエンキューしたいと考えています。
ファイナライザーを使用するのは簡単に思えますが、それは「ファイナライザーで管理されたリソースに触れないでください」という規則に違反しています。
では、行う作業がなくなったら、スレッドが正常に終了するようにするにはどうすればよいでしょうか?
受けたくない答え:
IDisposable
: これには基本クラスへの大規模な重大な変更が必要ですが、おそらく必要であることは認めます (これは常に IDisposable パターンの問題と思われます..)ThreadPool
: これらは長時間実行されるアクションであり、順番に実行する必要があります。したがって、専用スレッドが論理的な選択であると考えます。WeakReference
: 私はちょうどこれについて考えました。おそらくこれが正しい方法です(?)。基本的に、スレッドはWeakReference
所有しているオブジェクトに戻って保持し、定期的に自分自身を起こし、それWeakReference
がまだ生きているかどうかを確認します。スレッドが死ぬと、Terminate をキューに入れます。正確にはエレガントではありません-「定期的に自分自身を目覚めさせる」ビットは好きではありません-しかし、これは最良の解決策ですか?