Frage

Ich arbeite an einem Integrationstestprojekt in .NET.Die ausführbare Datei des Testframeworks startet einen Dienst und muss dann darauf warten, dass der Dienst einen Vorgang abschließt.

Was ist der beste Ansatz für die Exe, um auf den Dienst zu warten, um seine Aufgabe abzuschließen (der Dienst selbst wird nach Abschluss der Aufgabe nicht beendet)?

Beide Prozesse haben Zugriff auf dieselbe Datenbank, daher war mein erster Gedanke eine einfache Tabelle, die den Status des Dienstes aufzeichnet.Sobald signalisiert wird, dass der Vorgang erledigt ist, kann die Exe-Datei nicht mehr warten und ihre Aufgabe abschließen.Andere Ansätze?

Ich möchte noch einmal betonen, dass der Dienst, sobald er seine Aufgabe abgeschlossen hat, in einem laufenden bzw. im Speicher befindlichen Zustand bleibt, sodass es nicht funktioniert, darauf zu warten, dass er beendet wird.;-)

Außerdem dient dies ausschließlich Integrationstestzwecken und wird nie in Produktion gehen, daher ist „einfach“ das entscheidende Wort.

War es hilfreich?

Lösung

Sie können a passieren Semaphore Name des Dienstes in der Befehlszeile (oder über einen anderen Mechanismus wie hartes Codieren) und dann auf den Service zu warten Release() It, indem Sie anrufen WaitOne() in deinem exe.

App -Code:

Semaphore s = new Semaphore(1, 1, "MyNamedSemaphore");
// start service, passing the string "MyNamedSemaphore"
s.WaitOne(); // will wait for Release() in service

Service code:

// perform the initial task
// find semaphore name (i.e. from Environment.CommandLine)
Semaphore s = new Semaphore(1, 1, semaphoreName); // will use existing kernel object
s.Release(); // WaitOne in exe will complete

Andere Tipps

WMI -Anrufe sollten Ihnen geben, was Sie brauchen. Sie können Start/Fertigereignisse fangen und tun, was Sie von dort aus brauchen. (Danke an Chris Lively, dass er mir das gezeigt hat)

http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx

Alternativ können Sie System verwenden. Diagnostics.prozesses Namespace, um einen bestimmten aktiven Prozess abzufragen, und die Schleife bis zum Tod des Prozesses.

Können Sie den Servicecode ändern?

Wenn ja, verwenden Sie ein Kernel-Ereignisobjekt – der Dienst kann eines erstellen, Ihre App kann darauf warten, dass es signalisiert wird, und der Dienst kann ihm signalisieren, wenn es fertig ist.Sie müssen dem Ereignis einen Namen geben, damit es prozessübergreifend verwendet werden kann, aber das ist so einfach wie es nur geht.Der Dienst kann sogar mit dem vorhandenen Ereigniscode weiter ausgeführt werden. Niemand wird es bemerken, es sei denn, er versucht, ein Ereignis mit demselben Namen zu erstellen.(Oder Ihre Testanwendung könnte das Ereignis erstellen. Der Dienst kann dann versuchen, es zu öffnen, je nachdem, welcher Dienst zuerst gestartet wird.Wenn dies gelingt, kann es seine Auslösung durchführen, andernfalls funktioniert es wie gewohnt.

Hinweis:Sie möchten ein Auto-Reset-Ereignis, das seinen Zustand sofort zurücksetzt und alle wartenden Threads auslöst.

Ich bin mir bei den .NET-Routinen nicht sicher, aber Sie möchten Win32 CreateEvent, SetEvent und WaitForSingleObject.

Sie können IPC -Kanäle verwenden: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6143016.html

Oder vielleicht zwei Wege remotieren: http://www.codeproject.com/kb/ip/twowayremoting.aspx

Die Datenbankroute wäre einfach, aber nicht unbedingt das Beste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top