Laden...

Methode soll auf jeden Fall bis zuende ausgeführt werden trotz Thread.Suspend

Erstellt von partyboy vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.729 Views
P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 13 Jahren
Methode soll auf jeden Fall bis zuende ausgeführt werden trotz Thread.Suspend

Hi,

ich habe eine Methode (DoWork) die in einem Thread läuft. DoWork führt viele Befehle hintereinander aus. Bestimmte Befehle gehören aber zusammen und müssen immer komplett ausgeführt werden.
Nun möchte ich den Thread aber pausieren mittels Thread.Suspend.
Wie bekomme ich es hin, dass bestimmte Befehlsfolgen ununterbrechbar sind? Der Thread soll erst schlafen gelegt werden, wenn eine Befehlsreihe (hier 'step') vollständig durchgeführt wurde.


System.Threading.Thread tWorker;
private void DoWork()
{
	//step1
	Delay(3000);
	MessageBox.Show("step1 wurde vollständig ausgeführt.");
	//step2
	Delay(3000);
	MessageBox.Show("step2 wurde vollständig ausgeführt.");
	//step3
	Delay(3000);
	MessageBox.Show("step3 wurde vollständig ausgeführt.");
}

private void btnStart_Click(System.Object sender, System.EventArgs e)
{
	tWorker = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork));
	tWorker.Start();
}

private void btnPause_Click(System.Object sender, System.EventArgs e)
{
	tWorker.Suspend();
}


Ich dachte erst, der lock-Befehl würde mir da weiterhelfen aber er scheint in meinem Fall keine Auswirkungen zu haben. Die MessageBox erscheint nicht, nachdem ich den Thread pausiere.

object myLock = new object();
private void DoWork()
{
	lock ((myLock)) {
		//step1
		Delay(3000);
		MessageBox.Show("step1 wurde vollständig ausgeführt.");
	}
	lock ((myLock)) {
		//step2
		Delay(3000);
		MessageBox.Show("step2 wurde vollständig ausgeführt.");
	}
	lock ((myLock)) {
		//step3
		Delay(3000);
		MessageBox.Show("step3 wurde vollständig ausgeführt.");
	}
}

Wie macht man es richtig? Muss ich die Pause-Funktionalität selbst programmieren und dafür sorgen, dass einige Befehlsreihen atomar bleiben? Wie gehe ich da am Besten ran?

Viele Dank

Gelöschter Account
vor 13 Jahren

Ich dachte erst, der lock-Befehl würde mir da weiterhelfen

Der Lock Befehl ist für die Synchronisation unter den Threads zuständig.

Dein Problem löst man üblicherweise mit Flags. Prüfe in deinem Thread an den unkritischen Stellen dieses Flag und dann kann sich der Thread selbst schlafen legen.

5.742 Beiträge seit 2007
vor 13 Jahren

Dein Problem löst man üblicherweise mit Flags. Prüfe in deinem Thread an den unkritischen Stellen dieses Flag und dann kann sich der Thread selbst schlafen legen.

Oder verwende ein ManualResetEvent: An "unkritischen" Stellen wartest du darauf und wenn du den Thread unterbrechen möchtest, hebst du die Signalisierung für das Event auf.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo partyboy,

um explizit auszusprechen, was die anderen implizit gesagt haben: Mit Thread.Suspend bist du auf dem Holzweg.

herbivore

P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 13 Jahren

Vielen Dank für Eure Unterstützung.
Ich habs jetzt so gemacht, wie von JAck30lena beschrieben.

Von außerhalb der Klasse wird ein Pause-Flag gesetzt. Nach jeder zusammenhängenden Befehlsreihe wird das Pause-Flag geprüft. Wenn true, dann wird der Thread schlafen gelegt und vorher mittels event an die aufrufende Klasse mitgeteilt, dass der Thread nun schläft.

Gelöschter Account
vor 13 Jahren

Nur zur Sicherheit: Das "Pause-Flag" ist sicherlich "volatile".