Neustart eines Threads, in .NET (mit C#)
Ich bin auf der Suche nach einem Weg, um zu starten einen thread, der beendet wurde durch Abort()..
public partial class MyProgram : Form
{
private Thread MyThread = new Thread(MyFunction);
private System.Windows.Forms.Button startStopBtn = new System.Windows.Forms.Button();
public MyProgram()
{
MyThread.Start();
startStopBtn += new EventHandler(doStop);
startStopBtn.Text = "Stop";
}
private static void MyFunction()
{
//do something
}
private void doStop(object sender, EventArgs e)
{
MyThread.Abort();
startStopBtn -= new EventHandler(doStop);
startStopBtn += new EventHandler(doStart);
startStopBtn.Text = "Start";
}
private void doStart(object sender, EventArgs e)
{
MyThread.Start(); //<< Error returned when clicking the button for 2nd time
startStopBtn -= new EventHandler(doStart);
startStopBtn += new EventHandler(doStop);
startStopBtn.Text = "Stop";
}
}
Irgendeine Idee?
InformationsquelleAutor drowneath | 2009-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie einfach MyThread = new Thread(MyFunction) vor dem Aufruf MyThread.Start() doStart(). Nicht den thread, die außerhalb Ihrer Methoden, der Raum ist gedacht für die Erklärungen.
EDIT: Bitte beachten, dass das töten ein thread mit thread.Abort() kann sehr gefährlich sein. Sie sollten versuchen zu erreichen, sauber multithreading, wie Groo beschrieben in seinem post.
Du hast Recht, aber wenn ich ein Programmier-Anfänger, ich hatte einige ähnliche Probleme. Ich Las viele Lösungen wie, dass man von groo, und ja, du hast vollkommen Recht, meine Lösung ist nur ein workaround. Aber die Mechanismen, die groo beschreibt, waren zu Komplex für mich zu verstehen in meinem Programmier-Anfänger-Zeiten. So das ich dann, kann es besser sein, eine einfache "Antwort" (oder einen workaround) für einen Programmierer nicht so erfahren.
Das ist das Zeug, das macht schlechte Programmierer. Sie investieren nicht genug Zeit, um zu verstehen, was Sie tun. Wer geht zu bereinigen, dein Thread.Abbruch Durcheinander, wenn du Weg bist?
InformationsquelleAutor Emiswelt
Sobald Sie abgebrochen haben Ihren thread, Sie können nicht starten Sie es erneut.
Aber Ihre eigentliche problem ist, dass Sie Abbruch dein thread. Sollten Sie verwenden Sie niemals Thread.Abort().
Wenn dein thread sollte pausiert werden und fortgesetzt mehrmals, sollten Sie erwägen, andere Mechanismen (wie AutoResetEvent, zum Beispiel).
[BEARBEITEN]
Ist die einfachste Lösung zum Abbrechen eines thread-wie bereits erwähnt-durch Ian Griffiths in den link oben, ist:
Die einzige Sache, die Sie tun müssen, damit es richtig funktioniert, ist die Reihenfolge der hintergrund-Methode, so dass es läuft in einer Schleife -, so dass Sie in regelmäßigen Abständen überprüfen, ob Ihr flag gesetzt wurde, in einem anderen thread.
Wenn Sie brauchen, um die pause-und fortsetzen-Funktionalität für die gleichen worker thread, statt der einfachen
volatile bool
flag " - Ansatz, könnten Sie gehen Sie für einen etwas komplexeren Ansatz, eine Synchronisierung Konstrukt wieAutoResetEvent
. Diese Klassen bieten auch einen Weg, um die worker-thread für eine bestimmte (oder unbestimmte) Zeitspanne zwischen Signalen, die aus der nicht-worker-thread.Dieser thread enthält ein konkretes Beispiel mit Start, Pause, Resume und Stop-Methoden. Beachten Sie, wie Brannon Beispiel nie bricht den thread ab. Es wird nur ein Ereignis auslöst, und dann wartet, bis der thread beendet würde.
InformationsquelleAutor Groo
Die einfache Antwort ist, Sie kann nicht. Sobald ein thread abgebrochen wurde, können Sie nicht starten Sie es. Erstellen Sie einfach eine Methode oder etwas, dass gibt ein Thread-Objekt, wie Sie es brauchen. Wenn Sie brauchen einen neuen Thread, nur um es aus, die Methode.
InformationsquelleAutor BFree
Nein, gibt es nicht, aber warum sollte Sie das wollen? Einfach starten Sie einen neuen thread, mit dem gleichen ThreadStart, und die gleichen parameter (falls vorhanden).
InformationsquelleAutor John Saunders
Wenn Sie wirklich brauchen, zu unterbrechen, die thread-Funktion und resume, sollten Sie eine Bedingung und dann überprüfen Sie es in regelmäßigen Abständen während der Verarbeitung.
Erlauben würde, dass Sie zum beenden der Verarbeitung, die für einige Zeit und dann wieder.
Ich verwendet habe, Veranstaltungen und Warten-Aufrufe zu erreichen, eine ähnliche Aufgabe.
InformationsquelleAutor Brad Bruce
Der einfachste Weg ist, um nicht zum Abbruch der thread.
InformationsquelleAutor Rhythmic Fistman
Ich verstehe wirklich nicht, warum Menschen Informationen liefern, wenn Sie nicht wissen, das ist richtig..
Wie kann ein echter Programmierer aussetzen oder beenden der Verarbeitung ein thread für einige Zeit und dann loslassen und damit den code anfällig...
@Brad-- m sorry.. aber deine Idee war nicht gut..
@Rhythmische - Sie müssen die Arbeit auf Ihre Art und Weise an Dinge Herangehen..
Bfreies wurde etwas Recht, wenn du Menschen hast ihn genauso, wie er sagen wollte..
Sie müssen nur erneut erklären, dass..
unten ist das Beispiel:
Nun können Sie dieses Untermenü, um überall Sie wollen zu starten, den thread. Es wird automatisch Abbrechen, den thread.
Wenn Sie anfangen wollen, den Faden auf der Button1_click () - Ereignis und beenden Sie es auf Button2_Click () - Ereignis verwenden:
in der Button1_click () - Ereignis
in Button2_click () - Ereignis
tut diese Weise können Sie Abbrechen, Sie thread, wo immer Sie wollen, und initialisieren Sie es erneut.
Sie können auch YourThreadName.ThreadState.Running-Eigenschaft um zu prüfen, ob der thread aktiv ist oder nicht(Nur um zu vermeiden, mehrere Instanzen von dem gleichen thread.....
InformationsquelleAutor Sands