Sono nuovo di WCF. Inizialmente ho creato un servizio WCF e usato il proxy client generato per consumare il servizio dal client. Quindi ogni volta che eseguivo alcune operazioni sul servizio, tutto veniva eseguito in modo sequenziale mentre invocavo le operazioni in modo sincrono. Ho cambiato la modalità di concorrenza in più, ma le operazioni sono comunque avvenute in modo sincrono. Poi ho generato metodi asincroni per le mie operazioni e ho utilizzato i pattern di inizio/fine in modo tale da indovinare "liberato" il canale e lasciare che le operazioni avvengano in parallelo/aumentando in modo asincrono il throughput delle mie applicazioni.WCF - fabbrica canale vs base client
Quindi ho utilizzato ChannelFactory
per creare un canale ed eseguito le operazioni in quanto client e server possono condividere i contratti (stesso progetto). Ma IClientChannel
fornisce solo BeginOpen/EndOpen/BeignClose/EndClose
. Non dispone dei metodi BeginOperation/EndOperation
. Quindi in pratica non riesco a eseguire un'operazione in modo asincrono sul canale per liberare così posso usare il canale per eseguire altre operazioni.
L'ho semplicemente creato canali per ogni operazione e risolto il problema
Quindi la mia domanda è:
Che è meglio (
ClientBase vs. ChannelFactory
) rispetto al mio scenario soprattutto voglio eseguire più operazioni sull'oggetto servizio contemporaneamente con più threadÈ consigliabile creare un canale per ogni singola operazione?
Infatti, ho pensato che possiamo avere un solo canale tra due endpoint (client/servizio). Ma posso creare tutti i canali che voglio. Ad esempio: sono stato in grado di creare Int16.MaxValue dei canali. Quindi non sono sicuro di quale sia il limite e le raccomandazioni su questo.
Service[] channels = new IService[Int16.MaxValue]; for(int i = 0; i<Int16.MaxValue; i++) { channels[i] = factory.CreateChannel(); }
Quindi, in pratica si può per favore fatemelo sapere circa i principi fondamentali di canali e consigli e trucchi ecc ... ecc .. :)
Grazie Tim. Sì, sto anche facendo praticamente la stessa cosa. Creare un nuovo canale di comunicazione per ogni operazione e chiuderlo. Ho guardato i collegamenti, ma ho ancora alcune domande.1. Quanti canali sono raccomandati? 2. Per eseguire le operazioni in modo sincrono utilizzando la factory di canale, è sufficiente aggiungere i metodi BeginOp/EndOp all'interfaccia del canale. resto tutto è curato da WCF - in altre parole svcutil util genera così tanto codice che non ci interessa. ci interessa solo la definizione dell'interfaccia e lasciamo che il WCF faccia il grande lavoro. Se sì, questo è bello. \ – Dreamer
Domande oltre a quelle sopra? – Tim
@Dreamer - Non penso che ci sia un numero raccomandato di canali. Se disponi di molti client, potresti riscontrare problemi di connessione concomitanti, ma puoi modificarlo nella configurazione. Per quanto riguarda la tua seconda domanda, non ho ancora fatto nulla di asincrono in WCF (ci stiamo preparando a farlo nel nostro prossimo turno di lavoro), ma penserei che se l'interfaccia è corretta, dovresti essere ok. – Tim