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]

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Administratoren - Kompakt

Nach dieser Schulung beherrschen Sie die Grundlagen des TFS. Sie erledigen administrative Aufgaben schnell und sicher.

#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!