4 Stimmen

Umfang der Fadenerstellung und der Garbage Collector

Macht es für den Garbage Collector einen Unterschied, wenn wir einen Thread im Bereich der Methode und nicht im Bereich der Klasse deklarieren, z. B:

//scenario 1
public class Foo
{
    public Foo()
    {
        new Thread(()=> /*engine*/) { IsBackground = true }.Start();
    }
}

//scenario 2
public class Bar
{
    private readonly Thread _engineThread = null;

    public Bar()
    {
        _engineThread = new Thread(()=> /*engine*/) { IsBackground = true };
        _engineThread.Start();
    }
}

5voto

Jon Skeet Punkte 1325502

Ja - im ersten Ansatz, der Thread Objekt kommt für die Garbage Collection in Frage, sobald der zugrunde liegende Thread beendet ist.

Beim zweiten Ansatz, wenn die Instanz von Bar ist noch no die für die Müllabfuhr in Frage kommen, wird das verhindern, dass die Thread Objekt vor dem Garbage Collecting zu schützen. Ich bezweifle, dass dies Auswirkungen auf den zugrunde liegenden OS-Thread hat, wohlgemerkt.

Ich würde allerdings nicht über die Auswirkungen auf den GC nachdenken - ich würde mich auf die Lesbarkeit konzentrieren. Brauchen Sie aus irgendeinem Grund einen Verweis auf den Hintergrund-Thread? Wenn ja, wählen Sie den zweiten Ansatz, damit er Ihnen zur Verfügung steht. Wenn Sie nicht brauchen, wäre es sinnlos, es als Feld zu haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X