Ich habe eine Anwendung, die von Benutzern geschriebene DLLs dynamisch lädt und ausführt. Die Anwendung verfügt über eine Scheduling-Engine, die mit einem Zeitgeber arbeitet und prüft, welche "Regeln" (DLLs) ausgeführt werden sollen. Jede Regel wird mit einem eigenen Thread gestartet:
private void OnTimer(...)
{
timer.stop();
...
foreach(RuleData ruleData in RulesToRun)
ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ExecuteRule), ruleData);
_asyncOpsAreDone.WaitOne();
timer.start();
}
und wenn die asynchronen Operationen abgeschlossen sind, wartet das Programm auf das Ticken des Scheduling-Timers und führt eine weitere Schleife aus.
Das Problem ist, dass Benutzer manchmal Dlls schreiben, die sehr viel Zeit zum Ausführen benötigen.
- Wenn ich warte: Dies wird den nächsten Timer-Tick verschieben (da er während der Ausführung angehalten und danach wieder gestartet wird)
- Wenn ich nicht warten will: Ich suche nach einer unbekannten Anzahl von Regeln, die parallel laufen und meinen Pool von Anwendungsbenutzern beenden.
Wenn Sie in Betracht ziehen würden, dass eine Regelausführung hängen könnte, ist meine Wahl zwischen: Synch - alle Regeln hängen, oder Asynch - trockene Ressourcenpools.
Ich habe ernsthaft darüber nachgedacht, der Regelausführung eine Zeitüberschreitung zu geben, aber .Abort() ist nicht so beliebt: Timeout-Muster - Wie schlimm ist Thread.Abort wirklich?
Und Parallele progrming Lösung für Abbruch der Aufgabe, beinhaltet das Schreiben von "ThrowIfCancellationRequested();" in der Dll-Ausführung (die ich nicht Quellcode für haben) http://msdn.microsoft.com/en-us/library/dd997396.aspx