zeitgesteuerte Klasse
Kleines Snippet wie man unter C-Sharp eine zeitgesteuerte Klasse erstellt.
public Form1()
{
InitializeComponent();
to = new TL.TimeOutWatch.TimeOut();
}
private void LongThread()
{
System.Threading.Thread.Sleep(5000);
MessageBox.Show("Beendet");
}
private void LongThread(string message)
{
System.Threading.Thread.Sleep(5000);
MessageBox.Show(message);
}
private void button1_Click(object sender, EventArgs e)
{
if(!to.DoIt(new RunMethodDelegate(LongThread), TimeSpan.FromSeconds(2)))
MessageBox.Show("Achtung, festgelegte Zeit wurde überschritten.");
}
private void button2_Click(object sender, EventArgs e)
{
if (!to.DoIt(new RunMethod2Delegate(LongThread), new object[] { textBox1.Text }, TimeSpan.FromSeconds(10)))
{
MessageBox.Show("Achtung, festgelegte Zeit wurde überschritten.");
}
}
*
* TimeOutWatch - Die Ausführungszeit einer Methode einschränken
* --------------------------------------------------------------
* Version: 1.0
* Copyright © 2007 Konstantin Gross
* http://www.texturenland.de
*
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace TL.TimeOutWatch
{
/// <summary>
/// Die Ausführungszeit einer Methode kontrollieren.
/// </summary>
public class TimeOut
{
private AutoResetEvent evnt = new AutoResetEvent(false);
public delegate void RunMethodDelegate();
/// <summary>
/// Führt die Methode aus, die in einer festgesetzen Zeit erfolgen soll.
/// </summary>
/// <param name="runMethod">Methode zum ausführen</param>
/// <param name="timeout">Zu erwartende Höchstzeit, bevor die Ausführung der Methode abgebrochen wird</param>
/// <returns>True, wenn die Ausführung der Methode vor dem Timeout zu Ende gegangen ist. False wenn das Timeout überschritten wurde.</returns>
public bool DoIt(Delegate runMethod, TimeSpan timeout)
{
return this.DoIt(runMethod, null, timeout);
}
/// <summary>
/// Führt die Methode aus, die in einer festgesetzten Zeit erfolgen soll und übergibt die für sie bestimmte Parameter.
/// </summary>
/// <param name="runMethod">Methode zum ausführen</param>
/// <param name="parameters">Parametertabelle</param>
/// <param name="timeout">Zu erwartende Höchstzeit, bevor die Ausführung der Methode abgebrochen wird</param>
/// <returns>True, wenn die Ausführung der Methode vor dem Timeout zu Ende gegangen ist. False wenn das Timeout überschritten wurde.</returns>
public bool DoIt(Delegate runMethod, object[] parameters, TimeSpan timeout)
{
return this.DoItImp(runMethod, parameters, timeout);
}
/// <summary>
/// Führt die Methode mittels Delegate und übergebenen Parametern, die in der festgesetzen Zeit ausgeführt wurde.
/// </summary>
/// <param name="d">Auszuführendes Delegate</param>
/// <param name="parameters">Zu übergebende Paramter für das Delegate</param>
/// <param name="timeout">Zu erwartende Höchstzeit, bevor die Ausführung des Delegates abgebrochen wird</param>
/// <returns>True, wenn die Ausführung des Delegates vor dem Timeout zu Ende gegangen ist. False wenn das Timeout überschritten wurde.</returns>
private bool DoItImp(Delegate d, object[] parameters, TimeSpan timeout)
{
Worker w = new Worker(d, parameters, this.evnt);
Thread t = new Thread(new ThreadStart(w.Run));
evnt.Reset();
t.Start();
if (evnt.WaitOne(timeout, false))
{
return true;
}
else
{
t.Abort();
return false;
}
}
#region Worker Klasse
private class Worker
{
private AutoResetEvent evnt;
public Delegate method;
public object[] parameters;
public Worker(Delegate method, object[] parameters, AutoResetEvent evnt)
{
this.method = method;
this.parameters = parameters;
this.evnt = evnt;
}
public void Run()
{
this.method.DynamicInvoke(parameters);
evnt.Set();
}
}
#endregion
}
}