1

したがって、次のように設定されたクラスがあります。

public class NetworkServer
{
    private BlockingCollection<byte[]> receivingQueue;

    public NetworkServer(IPEndPoint endpoint, int packetsize)
    {
        receivingQueue = new BlockingCollection<byte[]>(new ConcurrentQueue<byte[]>());
        // Do some other stuff here
    }

    public ~NetworkServer()
    {
        // Do some stuff here
        Task.Factory.StartNew(() => Parallel.ForEach<byte[]>(receivingQueue, item => SomeOtherClass.ParseItem(item)));
    }
}

デストラクタで を使用すると、 のインスタンスがガベージ コレクションされる可能性がTask.Factory.StartNewある場合でも、実行を継続する新しいスレッドが作成されるかどうか疑問に思っていました。NetworkServerこれがうまくいかない場合、新しいスレッドでこれらの各アイテムを解析する/のインスタンスNetworkServerが GC された後にアイテムを解析する最良の方法は何でしょうか。また、ParseItem明確ではなかった場合に備えて、別のクラスになります。

ありがとう。

4

2 に答える 2

3

技術的にはそうなるでしょう。

しかし、それはデストラクタではありません。それがファイナライザーです。

16GB の RAM を搭載したマシンを使用している場合、最初のファイナライザーは開始から数時間後に実行される可能性があります。それは間違いなく悪い設計です。

于 2012-07-12T08:09:11.483 に答える
-1

That's truly awful! Don't do it! You don't know much at all about the context from which the finalizer will run. Look to fix your design if you think you need to do this kind of thing - it has a code stench.

于 2012-07-12T08:07:58.390 に答える