2

BackgroundWorkerスレッド (純粋に Action デリゲートのキュー)を持つオブジェクトがあります。つまり、これは一般的で単純な単一生産者、単一消費者のシナリオです。

BackgroundWorker単一のプロデューサーが収集されたら、Terminate アクションをスレッドにエンキューしたいと考えています。

ファイナライザーを使用するのは簡単に思えますが、それは「ファイナライザーで管理されたリソースに触れないでください」という規則に違反しています。

では、行う作業がなくなったら、スレッドが正常に終了するようにするにはどうすればよいでしょうか?

受けたくない答え:

  • IDisposable: これには基本クラスへの大規模な重大な変更が必要ですが、おそらく必要であることは認めます (これは常に IDisposable パターンの問題と思われます..)
  • ThreadPool: これらは長時間実行されるアクションであり、順番に実行する必要があります。したがって、専用スレッドが論理的な選択であると考えます。
  • WeakReference: 私はちょうどこれについて考えました。おそらくこれが正しい方法です(?)。基本的に、スレッドはWeakReference所有しているオブジェクトに戻って保持し、定期的に自分自身を起こし、それWeakReferenceがまだ生きているかどうかを確認します。スレッドが死ぬと、Terminate をキューに入れます。正確にはエレガントではありません-「定期的に自分自身を目覚めさせる」ビットは好きではありません-しかし、これは最良の解決策ですか?
4

1 に答える 1

2

IDisposableガベージコレクションからトリガーするのではなく、生産が終了したときに明示的に言うのが最善のアプローチのように思えます。

基本的に、問題はワーカー スレッドを終了していないように思えます。これは、作成が完了したことを示しています。状況によっては注意が必要なことは理解していますが、可能であれば明示的に行うことができれば、人生がより予測可能になります。

于 2011-06-16T06:05:29.267 に答える