2009-04-27 6 views
1

Ich versuche, eine Klasse zu erstellen, mit der ich Methoden mit einem angegebenen Zeitlimit aufrufen kann. Ich habe die tatsächliche Timeout-Implementierung funktioniert, aber habe Probleme beim Einkapseln dieser in eine Klasse erfolgreich.Erstellen einer wiederverwendbaren Methode Timeout-Klasse in C#

Ich habe mich zu dieser Zeit entschieden, mich auf die Arbeit mit nur den 5 Action Delegaten zu beschränken, um eine Zeitüberschreitung für Methoden zu setzen, die 0 - 4 Argumente annehmen. Für die Zwecke dieser Frage werde ich die eine Argumentvariante von Aktion verwenden.

Meine Ideal Aufrufsyntax wäre so etwas wie dies:

Action<int> a = new TimeoutAction(i => i + 1) 
{ 
    Timeout = Timespan.FromSeconds(10) 
} 

oder dies:

Action<int> a = (x => x + 1).Timeout(Timespan.FromSeconds(10)) 

Ich bin fast sicher, dass die erste Version ist nicht möglich, da es keine Möglichkeit gibt, von einem erben delegieren. Die zweite Möglichkeit ist möglich, indem eine Erweiterungsmethode für den Typ Delegate verwendet wird.

Ein letzter Fallback wäre, statische Methoden zu erstellen, die den entsprechenden Delegattyp übernehmen und einen Delegaten mit der gleichen Signatur, aber mit den Timeouts zurückgeben.

Irgendwelche Vorschläge oder Ideen?

Antwort

2

Ihre letzte Vorschlag wäre der richtige Weg:

Eine endgültige Rückfall wäre statische Methoden zu erstellen, die in der entsprechenden Delegattyp nehmen und geben einen Delegierten mit der gleichen Signatur aber mit der Timeouts enthalten.

Mit anderen Worten:

public static Action<T> Timeout<T>(this Action<T> action, TimeSpan timeSpan); 
public static Action<T1, T2> Timeout<T1, T2>(this Action<T1, T2> action, TimeSpan timeSpan); 
public static Func<T, TResult> Timeout<T, TResult>(this Func<T, TResult> action, TimeSpan timeSpan); 
public static Func<T1, T2, TResult> Timeout<T1, T2, TResult>(this Func<T1, T2, TResult> action, TimeSpan timeSpan); 
/* snip the rest of the Action<...> and Func<...> overloads */ 

"Warum kann ich nicht ein Verfahren nur erklären?"

Sie könnten eine Methode deklarieren, die ein Delegate akzeptiert und gibt ein Delegate, aber dann würden Sie die Delegaten Typinformationen (Ihr zweites Beispiel kompilieren würde nicht) verlieren.

Leider ist das folgende Beispiel ist nicht gültig C# - Sie nicht Delegate als Typ-Parameter-Einschränkung verwenden:

public static TDelegate Timeout<TDelegate>(this TDelegate d, Timespan timespan) where TDelegate : Delegate; 
-1

Nun, ein Lambda-Ausdruck wird nicht "einen Typ haben"

new DelType(lambda) 

oder

Stat.Method(lambda) 

oder anderweitig Kontext zu machen, so schlage ich vor, die letzte Option (statische Methode):

Timeout.Action(lambda, timeoutVal) 
0

Wie wäre es so etwas wie die Annäherung an eine Timed sperren, wie here?

Verwandte Themen