Feedback

C# - Thread nach Timeout beenden

Veröffentlicht von am 23.06.2009
(2 Bewertungen)
Das Beispiel zeigt wie eine Methode bzw. ein Thread welche die Methode ausführt nach einem bestimmten Timeout beendet falls die Methode noch nicht fertig ist.
GFU-Schulungen  [Anzeige]

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

#define LONG
//-----------------------------------------------------------------------------
using System;
using System.Threading;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main(string[] args)
		{
			// Wird zur Threadbenachrichtigung benötigt:
			AutoResetEvent signal = new AutoResetEvent(false);

			// Wird benötigt da ThreadPool verwendet wird:
			Thread workerThread = null;

			// Durch diese Variante gibt es den Vorteil dass 
			// die Worker-Methode nicht geändert werden muss.
			ThreadPool.QueueUserWorkItem((o) =>
			{
				// Auf ThreadPool-Threads kann normalerweise nicht 
				// zugegriffen werden. Mit diesem "Trick" gehts.
				workerThread = Thread.CurrentThread;

				// Worker starten:
				Worker();

				// Benachrichtigen dass Worker fertig ist:
				signal.Set();
			});

			// Timer starten der 5 Sekunden wartet und dann das Signal
			// setzt.
			new Timer((o) => { signal.Set(); }, null, 5000, Timeout.Infinite);

			// Warten bis das Signal gesetz ist:
			signal.WaitOne();

			// Prüfen ob der WorkerThread noch arbeitet. Falls ja den Thread
			// abbrechen. Würde im Worker eine Schleife ausgeführt werden
			// könnte diese eleganter beendet werden in dem Worker in eine
			// Klasse gepackt wird und diese Klasse eine Methode 
			// RequestStop implementiert welche ein volatile-bool-Feld
			// setzt welches in jedem Schleifendurchgang abgefragt wird.
			// Ist dieses bool-Feld gesetz so beende die Arbeit.
			if (workerThread != null && workerThread.IsAlive)
				workerThread.Abort(); 

			Console.WriteLine("Fertig.");
			Console.ReadKey();
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Arbeits-Methode.
		/// </summary>
		static void Worker()
		{
			Console.WriteLine("In Worker");

			// Lange Arbeit simulieren:
#if LONG
			Thread.Sleep(200000);
#else
			Thread.Sleep(1000);
#endif
			Console.WriteLine("Worker fertig.");
		}
	}
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!