1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/*
* 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
}
}
|