2

ObjectA私が(of classA)を持っているとしましょう。

List<classB> bList;

ここで、それぞれobjectBに実行中のスレッドがいくつかあるとします (外部からアクセスすることはできませんobjectB) 。threadB1threadB2

今、objectBそのようなリストの特定で、それをthreadB2発見しobjectBRemove==trueます。

それが起こったら、そのようなオブジェクトからすべてのスレッドを終了し、それを削除したいと思いますbList(事実上 this を破棄したいobjectB)。

内部でイベントを発生させ、そのようなイベントに a のメソッドをobjectBサブスクライブできると思いました:objectA

public void onObjectBRemove(object sender, EventArgs e)
{
    bList.Remove((classB) sender);
}

objectBこれがのイベント発生後に呼び出されると、これはobjectBリストから削除されます。次に、ガベージ コレクターは、objectB参照されなくなったことに気付き、それを削除して、すべての内部スレッドも終了します。

これは機能するはずですか?これは目前の問題に対する合理的なアプローチですか?

4

1 に答える 1

3

objectB のイベントが発生した後にこれが呼び出されると、リストから objectB が削除されます。次に、ガベージ コレクターは、objectB が参照されなくなったことを認識して削除し、すべての内部スレッドも終了します。

これにより、リストからオブジェクトが削除されますが、List<T>スレッド セーフではないため、同期 (または などのスレッド セーフ コレクションConcurrentBag<T>) が必要になります。

これは実行中のスレッドを終了しないことに注意してください。実行中の操作を停止する場合は、.NET の協調キャンセルを使用して、a をキャンセル状態に設定するCancellationTokenSource必要があります。この時点で、スレッドは正常に終了できます。

于 2013-08-27T21:36:15.627 に答える