2 Stimmen

Zeitüberschreitung für Thread-Kill

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

0voto

user355289 Punkte 1060

Der dritte Kommentar von "sgorozco" hat mir am meisten geholfen. Ich habe mich entschieden, die Regeln weiterhin asynchron auszuführen, aber die, die bereits in Bearbeitung sind, auf diese Weise zu überspringen:

  • Erledigen Sie die Arbeit rechtzeitig für andere Regeln, die korrekt geschrieben sind.

  • Überspringen Sie Aufträge, die nicht weitergehen.

  • Vermeiden Sie das Beenden von Threads und das Hinterlassen von kaputtem Speicher-Müll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X