Come attendere lo stato di un altro processo in .NET?
-
03-07-2019 - |
Domanda
Sto lavorando a un progetto di test di integrazione in .NET. L'eseguibile del framework di test avvia un servizio e quindi deve attendere che il servizio completi un'operazione.
Qual è l'approccio migliore affinché l'exe attenda che il servizio completi il ??suo compito (il servizio stesso non uscirà al completamento del compito)?
Entrambi i processi hanno accesso allo stesso database, quindi il mio primo pensiero è stato una semplice tabella che registra lo stato del servizio. Una volta che viene segnalato che è finito, l'exe può smettere di aspettare e completare il suo compito. Altri approcci?
Consentitemi di ribadire che il servizio, una volta completato il suo compito, rimarrà in uno stato di esecuzione / in memoria, quindi attendere che esca non funzionerà. ; -)
Inoltre, questo è puramente a scopo di test di integrazione e non entrerà mai in produzione, quindi "semplice". è la parola chiave.
Soluzione
Puoi passare un nome Semaphore
al servizio dalla riga di comando (o tramite qualche altro meccanismo, come hard coding ), quindi attendere il servizio su < code> Rilascia () , chiamando WaitOne ()
nel tuo exe.
Codice app:
Semaphore s = new Semaphore(1, 1, "MyNamedSemaphore");
// start service, passing the string "MyNamedSemaphore"
s.WaitOne(); // will wait for Release() in service
Codice servizio:
// 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
Altri suggerimenti
Le chiamate WMI dovrebbero darti ciò di cui hai bisogno. Puoi prendere eventi iniziati / finiti e fare quello che ti serve da lì. (Grazie a Chris Lively per avermelo mostrato)
http://weblogs.asp.net/whaggard/archive/2006/02/11/438006 aspx
In alternativa puoi utilizzare lo spazio dei nomi System.Diagnostics.Processes per eseguire una query per un particolare processo attivo e eseguire il ciclo fino a quando il processo non viene interrotto.
Puoi modificare il codice del servizio?
In tal caso, utilizzare un oggetto Event del kernel: il servizio può crearne uno, l'app può attendere che venga segnalata e il servizio può segnalarlo al termine. Dovrai dare un nome all'evento affinché venga utilizzato tra processi, ma è semplice. Il servizio può anche continuare a funzionare con il codice evento presente, nessuno noterà a meno che non provino a creare un evento con lo stesso nome. (oppure, il tuo testapp potrebbe creare l'evento, il servizio può quindi provare ad aprirlo, a seconda di quale è stato avviato per primo. Se riesce, può eseguire il suo innesco, altrimenti funziona come al solito).
Suggerimento: vuoi un evento di auto-reset che "ribalta" il suo stato immediatamente ha innescato tutti i thread in attesa.
Non sono sicuro delle routine .NET, ma vuoi Win32 CreateEvent, SetEvent e WaitForSingleObject.
È possibile utilizzare i canali IPC: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6143016.html
O forse remoting bidirezionale: http://www.codeproject.com/KB /IP/TwoWayRemoting.aspx
Il percorso del database sarebbe semplice , ma non necessariamente il migliore.