Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1562 | Anzahl registrierter User: 1893 | Besucher online: 79
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Die Ausführungszeit einer Methode einschränken


Autor: Konstantin Gross
Sprache: C#
Bewertung:
8.56 (2 votes)
Anzahl der Aufrufe: 12605
  
Kick it on dotnet-kicks.de  

Beschreibung:

Es ist manchmal nützlich, die Zeit zu begrenzen, die eine Methode braucht um sich auszuführen. Zum Beispiel kann man der Ansicht sein, dass nach 30 Sekunden eine Aktion wirklich zu lange braucht und sie in diesem Fall abbricht.

Im unteren Beispiel, zeige ich wie man auf zwei verschiedene Arten die Klasse benutzt. Die die Ausführung einer Methode unterbricht wenn sie zuviel Zeit in Anspruch nimmt.

Benutzung:
private delegate void RunMethodDelegate();
private delegate void RunMethod2Delegate(string message);
private TL.TimeOutWatch.TimeOut to;

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.");
}
}

Viel Spaß :)


Abgelegt unter: time, timespan, thread, threading, abbrechen, abort, ausführungszeit, methode, method.



C#
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
    }
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)



schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.