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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top