Feedback

C# - Thread nach Timeout beenden

Veröffentlicht von am 23.06.2009
(1 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.
Snippet in VB übersetzen
#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!