Ich habe eine Reihe von Code-Blöcken, die zu lange dauern. Ich brauche keine Finesse, wenn es nicht klappt. In der Tat, ich möchte eine Ausnahme auslösen, wenn diese Blöcke zu lange dauern, und nur durch unsere Standard-Fehlerbehandlung fallen. Ich würde es vorziehen, KEINE Methoden aus jedem Block zu erstellen (was die einzigen Vorschläge sind, die ich bisher gesehen habe), da dies eine grundlegende Neuschreibung der Codebasis erfordern würde.Wie erstellt man ein generisches Timeout-Objekt für verschiedene Codeblöcke?
Hier ist, was ich würde LIKE zu erstellen, wenn möglich.
Ich habe ein einfaches Objekt erstellt, um dies mit der Timer-Klasse zu tun. (Hinweis für diejenigen, die kopieren mag/Paste: DIESES Code funktioniert nicht !!)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
public class MyTimeoutObject : IDisposable
{
private Timer timer = null;
public MyTimeoutObject (TimeSpan ts)
{
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Interval = ts.TotalMilliseconds;
timer.Start();
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
throw new TimeoutException("A code block has timed out.");
}
public void Dispose()
{
if (timer != null)
{
timer.Stop();
}
}
}
Es ist nicht funktioniert, weil die System.Timers.Timer Klasse erfasst, absorbiert und ignoriert alle Ausnahmen geworfen innerhalb, was - wie ich entdeckt habe - mein Design besiegt. Jede andere Möglichkeit, diese Klasse/Funktionalität ohne ein totales Redesign zu erstellen?
Das schien vor zwei Stunden so einfach zu sein, verursacht mir aber viele Kopfschmerzen.
Behandeln Sie Ausnahmen auf der oberen Ebene, von wo Sie diese Methode aufrufen? Ist es außerdem eine Multithread-Umgebung? – Shaharyar
Sie können einen statischen Speicher von 'CancellationToken' verwenden und sie überall dort verwenden, wo Sie eine Aufgabe haben, oder - weniger elegant, aber vielleicht effektiver - einen anderen Prozess haben, der Ihren Hauptprozess beenden kann und über lokale HTTP- oder Named-Pipes aufgerufen wird –
Shaharyar: Ja. Der Fang ist weit oben in der Kette. Und ja, das ist eine Multithread-Umgebung. Die Bibliothek, die ich schreibe, soll in WinForms-Anwendungen und nicht im Web verwendet werden. – Jerry