C#: Frage zu Sourcecode

Gast #2364922
Lesenswert?

Ich benötige für meine C' Applikationen eine Timeout-Funktionalität.
Folgender Beispielcode habe ich gefunden:
1
public class PModel
2
{
3

4
 private System.Timers.Timer watchDogTimer;
5

6
 public PModel()
7
 {
8

9
      watchDogTimer = new System.Timers.Timer(1000);   //1 second timeout
10
      watchDogTimer.Enabled = false;
11
      watchDogTimer.AutoReset = true;
12

13
      watchDogTimer.Elapsed+=new ElapsedEventHandler(OnWatchDogBark);
14

15
 }
16

17
 public void OnWatchDogBark(object source, ElapsedEventArgs e)
18
 {
19

20
      watchDogTimer.Enabled = false;
21

22
      /*do something here on a time out*/
23

24
      watchDogTimer.Enabled = true;
25

26
 }
27
}

Nun habe ich in meiner Applikation eine neue Instanz von dieser Klasse 
PMODEL erzeugt:
1
PModel test;
2
test.OnWatchDogBark(?,?);

Welche Parameter übergibt man der Methode "OnWatchDogBark"?
#2365171
Lesenswert?

tigger schrieb:
> Das sagt mir schon was, aber ich weiss nun nicht wie ich hierfür ein
> delegat anlege und auf das Ereignis reagieren kann.

Das wird doch schon gemacht...
1
public void OnWatchDogBark(object source, ElapsedEventArgs e)
2
 {
3
    ...
4
 }

die Methode wird aufgerufen, wenn der Timer nach einer Sekunde 
abgelaufen ist und der Timer noch irgendwo gestartet werden würde...
Gast #2365569
Lesenswert?

Willst du nur einen Timeout "feststellen" oder deine Funktionalität 
"abbrechen" wenn sie zu lange dauert?

Falls ersteres:
1
DateTime starttime=DateTime.Now;
2
TimeSpan erlaubteZeit=new TimeSpan(0,1,2); // 1min 2sek
3

4
  tueIrgendwas();
5

6
TimeSpan zeitGebraucht=DateTime.Now-starttime;
7
if (zeitGebraucht>erlaubteZeit)
8
{
9
    // Scheiße, hat zulange gedauert
10
}
11
else
12
{
13
    // Ist rechtzeitig fertig geworden
14
}
Gast #2365582
Lesenswert?

Beispiel: Timeout fesstellen:
1
        
2
public Form1()
3
{
4
   InitializeComponent();
5

6
   // Create a timer with a ten second interval.
7
   aTimer = new System.Timers.Timer(2000);
8

9
   // Hook up the Elapsed event for the timer.
10
   aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
11

12
   // Set the Interval to 2 seconds (2000 milliseconds).
13
   //aTimer.Interval = 2000;
14
   aTimer.Enabled = true;
15
}
16

17
private static void OnTimedEvent(object source, ElapsedEventArgs e)
18
{
19
   aTimer.Enabled = false;
20
   MessageBox.Show("The Elapsed event was raised at {0}", e.SignalTime.ToString());
21
}
Gast #2365584
Lesenswert?

vllt. über nen Thread:
1
        private int ergebnis = 0;
2

3
        public void pseudomain()
4
        {
5
            // Thread anlegen und starten:
6
            Thread t = new Thread(this.tueWas);
7
            t.Start();
8

9
            // Auf Thread mit Timeout warten:
10
            TimeSpan erlaubteZeit=new TimeSpan(0,0,20); // 20s
11
            bool hasFinished=t.Join(erlaubteZeit);
12
            if (hasFinished)
13
            {
14
                // Thread wurde innerhalb 20s fertig, wir können mit dem Ergebnis was anfangen:
15
                tueWasMitErgebnis(ergebnis);
16
            }
17
            else
18
            {
19
                // Thread läuft noch weiter ;/
20
                // aber egal, verwenden wir halt das noch nicht vorhandene Ergebnis nicht ;D
21
                // Idealerweise sollten wir hier dem Thread noch signalisieren das er sich beenden soll
22
            }
23
        }
24

25
        private void tueWas()
26
        {
27
            // Hier steck die Funktionalität, in diesem Beispiel eine sehr simple ;D
28
            ergebnis = 1;
29
        }
30

31
        private void tueWasMitErgebnis(int ergebnis)
32
        {
33
            // Wir schreiben es einfach in die Konsole ;D
34
            Console.WriteLine("Ergebnis: " + ergebnis);
35
        }
Gast #2365616
Lesenswert?

Danke für die Unterstützung.
Ich finde folgenden Code besser:
1
public Form1()
2
{
3
   InitializeComponent();
4

5
   // Create a timer with a ten second interval.
6
   aTimer = new System.Timers.Timer(2000);
7

8
   // Hook up the Elapsed event for the timer.
9
   aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
10

11
   // Set the Interval to 2 seconds (2000 milliseconds).
12
   //aTimer.Interval = 2000;
13
   aTimer.Enabled = true;
14
}
15

16
private static void OnTimedEvent(object source, ElapsedEventArgs e)
17
{
18
   aTimer.Enabled = false;
19
   MessageBox.Show("The Elapsed event was raised at {0}",
20
e.SignalTime.ToString());
21
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren