4 Stimmen

C# Wie man den übergeordneten Thread beendet

Ein Elternteil hat mehrere Kind-Threads.

Wenn der Benutzer auf die Schaltfläche "Stop" klickt, sollte der übergeordnete Thread mit allen untergeordneten Threads beendet werden.

//calls a main thread           
 mainThread = new Thread(new ThreadStart(startWorking));
 mainThread.Start(); 
////////////////////////////////////////////////
   startWorking()
{
    ManualResetEventInstance                    =   new ManualResetEvent(false);
    ThreadPool.SetMaxThreads(m_ThreadPoolLimit, m_ThreadPoolLimit);

    for(int i = 0; i < list.count ; i++)
   {        

        ThreadData obj_ThreadData   =   new ThreadData();
        obj_ThreadData.name      =   list[i];

        m_ThreadCount++;             

        //execute 
        WaitCallback obj_waitCallBack = new WaitCallback(startParsing);

        ThreadPool.QueueUserWorkItem(obj_waitCallBack, obj_ThreadData);
    }
  ManualResetEventInstance.WaitOne();
}

Ich möchte mainThread beenden.

9voto

Pontus Gagge Punkte 16933

Allgemeiner Ratschlag: Killen Sie keine Threads (siehe z.B. Töten eines Fadens ). Dies birgt die Gefahr von Ressourcenverlusten und Datenverfälschungen aller Art.

Sorgen Sie dafür, dass die Threads sich gut benehmen und ihre Arbeit beenden, wenn sie signalisiert werden, durch welchen IPC-Mechanismus Sie auch immer bevorzugen.

Ich kann mich nicht daran erinnern, dass die .NET-APIs übergeordnete und untergeordnete Threads erkennen. Das würde die Beziehung zu Ihrer Verantwortung zu verfolgen.

2voto

MusiGenesis Punkte 72729

Sie sind definitiv nicht hier keine Threads löschen wollen, da (unter anderem) die fraglichen "Kind-Threads" alle aus dem Thread-Pool stammen.

Ver dieser Artikel zur Erstellung und Beendigung von Threads.

In Ihrem Fall haben Sie mehrere Threads, die alle die startParsing Methode. Angenommen, diese Methode enthält eine Schleife, dann würden Sie auf Klassenebene eine bool genannt. _stillWorking oder so ähnlich, und setzen Sie es auf true zu Beginn der startWorking Methode.

Innerhalb der Schleife in startParsing prüfen Sie, ob _stillWorking es true jedes Mal durch. Um alle diese Threads "abzubrechen", setzen Sie also einfach _stillWorking a false und warten Sie, bis die Fäden zu Ende sind.

2voto

Jay Punkte 12869

Sie könnten in Erwägung ziehen, die Aufforderung zur Beendigung des Kinder-Threads an den Eltern-Thread weiterzuleiten und sich dann dort damit zu befassen. Ich denke, das wird insgesamt viel einfacher sein.

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