2009-09-16 8 views

risposta

0

No, perché non vorrai mai farlo. Cosa stai cercando di ottenere davvero?

EDIT

Sulla base di ulteriori informazioni in arrivo, ecco cosa penso.

Se si desidera solo "stato permanente" per richiesta, è necessario utilizzare lo stato nell'istanza e utilizzare InstanceContextMode.PerCall, come da risposta di marc_s.

Se è necessario un po 'di stato nella memoria locale thread per la chiamata, è possibile considerare l'utilizzo di ICallContextInitializer come metodo per eseguire il marshalling dello stato sul thread selezionato da WCF per richiamare il metodo su (e pulire lo stato del thread quando la chiamata finisce).

Ma non dovresti preoccuparti di "quale thread". WCF gestirà ciò con un pool di thread per conto dell'utente.

+0

Potresti spiegarci un po 'di più? –

+0

L'idea è di condividere sessioni, credenziali, ecc. Db all'interno di una richiesta memorizzandole in ThreadContext. Questo ci aiuterà nel fare rollback, ecc. – Nazgul

+0

ovviamente è possibile - in realtà è persino la best practice raccomandata! Il ServiceHost ha un pool di thread di lavoro per questo esatto scopo –

6

Sì, è possibile farlo: si chiama gestione "per chiamata" delle richieste. ServiceHost creerà una nuova istanza della classe di servizio per ogni richiesta in arrivo per gestire quella richiesta.

Per fare questo, è necessario impostare la classe di servizio (quello che implementa l'interfaccia di servizio) di essere "PerCall" - si esegue questa operazione mediante l'applicazione di un attributo sul tuo classe di servizio:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService : IYourService 
{ 
... 
} 

Marc

+0

Ciò creerà una nuova istanza del servizio per chiamata, ma non genera un nuovo thread per chiamata. – Nazgul

+0

ma assegnerà la nuova istanza di servizio a un thread di lavoro per gestire la richiesta ...... –

+1

Non penso che tu possa fare più di questo. Non conosco alcuna impostazione in WCF per creare in modo specifico un nuovo thread per ogni richiesta. E perché vorresti davvero ?? La creazione di un thread completo è un'operazione piuttosto costosa - perché non utilizzare il pool integrato di thread di lavoro che sono già disponibili? –

3

dipende da che cosa esattamente si vuole, ma il seguente comportamento di servizio risolveremo:

ServiceBehavior: 
ConcurrencyMode=ConcurrencyMode.Multiple 
InstanceContextMode=InstanceContextMode.Single 

la classe sarà un Singleton, ma tutte le chiamate effettuate verso i metodi verrà eseguito in una SEPAR mangiato filo. Se hai bisogno di una sincronizzazione, devi farlo manualmente.

Inoltre, non dimenticare di esaminare la limitazione per essere consapevoli dei potenziali problemi di prestazioni.

Problemi correlati