Läuft eine lang andauernde Aufgaben in einem Windows-Dienst

Ich geschrieben habe, ein Windows-Dienst-Projekt, beherbergt eine lang andauernde Nachrichtensystem Aufgabe, die gemeint ist, für die Dauer des service. Wenn der Dienst gestartet wird, startet die task. Wenn der Dienst beendet, Stoppt er die Aufgabe:

void OnStart()
{
    MessagePump.Start();
}

void OnStop()
{
    MessagePump.Stop();
}

Wo MessagePump.Beginnen tut eine Aufgabe.Factory.StartNew und MessagePump.Stop-Signale die Aufgabe zu beenden und nicht Warten().

So weit So gut, aber ich Frage mich, wie man am besten auf Störungen reagiert. Wenn für die Aufgabe eine nicht behandelte Ausnahme, möchte ich den Dienst beenden, aber da ist nichts in der Regel Warten auf die Aufgabe, ich vorstellen, es werde einfach nur sitzen, nichts zu tun. Wie kann ich elegant mit dieser situation umzugehen?

UPDATE:

Der Konsens scheint zu sein, mit 'warten' oder ContinueWith. Hier ist, wie ich derzeit bin-Codierung meine Start-Methode zu verwenden:

public async static void Start()
{
    this.state = MessagePumpState.Running;
    this.task = Task.Factory.StartNew(() => this.ProcessLoop(), TaskCreationOptions.LongRunning);
    try
    {
        await this.task;
    }
    catch
    {
        this.state = MessagePumpState.Faulted;
        throw;
    }
}
  • Ich schlage vor, Sie verwenden async/await-mit rücktrittsmöglichkeit. Wann haben Sie das unbehandelte Ausnahme machen Stornierung-Programm wird wissen über den Fehler
  • Kann ich innerhalb eines Windows-Dienstes? Mein Verständnis ist, dass wenn ich ein await in OnStart() dann werde es nicht beenden, bis der Vorgang abgeschlossen? (könnte falsch sein)
  • Hmm. Was nicht erwartet Aufgabe auf MessagePump.Start()? Überprüfen Sie in diesem blog, können Sie finden, was Sie suchen. blog.stephencleary.com
InformationsquelleAutor Barguast | 2014-09-19
Schreibe einen Kommentar