2009-12-14 4 views
7

Qual è la differenza fra marcare un metodo WCF conQual è la differenza tra [OperationContract (IsOneWay = true)] e la casella di controllo delle operazioni asincrone generate?

[OperationContract(IsOneWay = true)]

attributo e controllando il generare casella asincrono operazioni quando si aggiunge un riferimento al servizio?

Da quello che ho letto, sembra che la natura asincrona della chiamata dovrebbe essere definito solo sul lato client. Se è questo il caso, qual è il punto dello [OperationContract(IsOneWay = true)]?

In questo momento, non mi resta che il seguente metodo in esecuzione nel metodo WCF.

public void UpdateIndex(IndexElement[] indexElements) 
    { 
     // start the update on a new thread. 
     Thread thread = new Thread(() => UpdateIndexThread(indexElements)); 
     thread.Start(); 
    } 

ho creato un riferimento al servizio nel codice del mio cliente, e ho semplicemente chiamare:

indexerClient.UpdateIndex(indexElements); 

Dove indexerClient è un'istanza del mio servizio WCF.

Questo dovrebbe funzionare anche? Non sembra, è quasi come se aspettasse il completamento del thread prima di tornare.

risposta

11

Questi sono molto diversi.

A livello concettuale, IsOneWay = true dice che il modello di messaggistica è 'il fuoco e dimentica' al contrario di esempio 'richiedere risposta'. Cioè, IOW = true significa che c'è un messaggio dal client al server, ma non una risposta dal server al client. Al contrario, un metodo non IOW = true tipicamente avrà un messaggio di risposta, anche se il tipo restituito è nullo (ad esempio un messaggio 'vuoto').

Il modello asincrono è per come il codice cliente si comporta - per esempio blocca in attesa del valore restituito o meno. Async è una cosa "locale", vedi this blog per i dettagli. È possibile avere un client asincrono per un server di sincronizzazione o un client di sincronizzazione per un server asincrono. WCF farà la magia sotto il cofano per darti un modello di programmazione. Se hai, ad es. un modello di messaggistica richiesta-risposta e utilizzare 'generare asincroni', il client generato ti darà ad es. un metodo che puoi chiamare asincrono (ad esempio, invia il messaggio e ricevi una richiamata quando arriva la risposta).

in modo da utilizzare 'asincrono' per 'modello di programmazione locale', e utilizzare IOW per 'la messaggistica sul filo'.

Si noti che nel tuo esempio, se si contrassegna il metodo IOW = true, allora penso che ci sia alcun motivo per il Thread.start() nel codice del server. Puoi semplicemente eseguire il lavoro direttamente sul thread che WCF ha fornito al tuo server.

+0

Questo ha molto senso! Grazie mille - cancella un sacco di frustrazione! – Matt

+0

Giusto per chiarire, questo dovrebbe leggere in questo modo giusto? Cioè, IOW = true significa che c'è un messaggio dal client al server e una risposta dal server al client. Al contrario, un metodo non IOW = true in genere NON ha un messaggio di risposta, anche se il tipo di reso è nullo (ad esempio un messaggio 'vuoto'). – Matt

+0

Grazie, ho avuto una frase all'indietro, ho appena modificato per correggere. – Brian