2012-02-06 12 views
5

Sto creando un'applicazione con un servizio NetTcpBinding e uno BasicHttpBinding. Tramite questi servizi, i client inviano richieste all'applicazione: queste richieste devono essere inserite in un oggetto Queue, ovvero la coda della richiesta in entrata.Accesso simultaneo a una coda da più thread

  1. Entrambi i servizi devono consentire chiamate concorrenti dai client.
  2. Ciò significa che entrambi i servizi devono accedere contemporaneamente alla coda per aggiungere le richieste ricevute.
  3. Inoltre, un altro thread deve accedere alla coda per ottenere ed elaborare le richieste.

ho potuto utilizzare ConcurrencyMode.Multiple e tante chiamate potrebbero essere prese simultaneamente. Tuttavia, questo non garantisce un accesso concorrente alla coda. Devo inserire i due ServiceHost in due thread diversi? Ad esempio:

  • Il primo thread accelera e elabora le richieste in coda.
  • Il secondo thread crea il servizio NetTcpBinding e accoda le nuove richieste nella coda. Inoltre, invia eventuali risposte tramite callback.
  • Il terzo thread crea il servizio BasicHttpBinding e accoda le nuove richieste nella coda.

Questa è la mia idea. Dato che sono quasi un principiante, sarei grato se potessi darmi qualche consiglio. Forse dovrei iniziare a scrivere tre thread che accedono contemporaneamente alla coda: per il momento i primi due thread possono accodare richieste casuali alla coda, mentre il terzo thread consuma queste richieste.

+2

Sei in coda? Puoi usare ConcurrentQueue o BlockingCollection? Questo è un problema produttore/consumatore piuttosto standard. – Joe

+0

@Joe: Per ora dovrei usare collezioni non thread-safe, come 'Queue',' Dictionary', ect .. – enzom83

+0

Qualsiasi motivo particolare per cui? Probabilmente stai semplicemente reimplementando la ruota. – Joe

risposta

3

Dal momento che definisci te stesso come "Sono quasi un principiante". Ti suggerirei una lettura più generale - Threading in C# Joseph Albahari articolo/libro online gratuito. Esamina accuratamente i problemi e la strumentazione del threading in C#.

Vi assicuro che un'attenta lettura delle parti 3 e 4 (e la revisione delle parti 1 e 2) vi fornirà gli strumenti per risolvere non solo il vostro problema attuale ma molti altri problemi che incontrerete sulla via del multithreading.

Se vuoi solo una risposta veloce alla tua domanda, basta seguire la risposta di Yahia.

9

Se si è su .NET 4, è necessario esaminare ConcurrentQueue<T> e BlockingCollection.

Bascalmente si tratta di collezioni thread-safe implementate per prestazioni elevate e per lo più senza blocco.

BlockingCollection è specificamente implementato per Scenari Consumer-Producer come quello che descrivi.

Per riferimento vedi:

Problemi correlati