2010-11-19 14 views
1

Je voudrais créer facilement des méthodes asynchrones pour mon service WCF. Je sais que la méthode consiste à utiliser le modèle asynchrone Début/Fin et à étiqueter ma méthode Begin avec AsyncPattern = true. Je me demande si j'ai vraiment besoin de créer mon propre objet AsyncResult à gérer (ce que je suis un peu nerveux) ou si je peux utiliser un gestionnaire d'événement et envelopper mon Begin/End autour de l'invocation Begin/End du gestionnaire d'événements . Cela semble être une manière détournée de le faire, mais puisque (pour autant que je sache) je ne peux pas m'abonner ou invoquer l'événement directement à partir de la WCF, cela semble être une solution plausible.Puis-je raccourcir le modèle async Begin/End en utilisant un événement pour créer mon AsyncResult?

private event EventHandler<RequestEventArgs> OnSendRequest; 

[OperationContract(AsyncPattern = true)] // Borrowed from the interface for this example 
public IAsyncResult BeginSendRequest(Request request, AsyncCallback callback, object state) 
{ 
    EventHandler<RequestEventArgs> handler = OnSendRequest; 
    if (handler != null) 
     return handler.BeginInvoke(this, new RequestEventArgs(request), callback, handler); 
    return null; 
} 

public void EndSendRequest(IAsyncResult result) 
{ 
    EventHandler<RequestEventArgs> handler = (EventHandler<RequestEventArgs>)result.AsyncState; 
    handler.EndInvoke(result); 
} 

Puis, évidemment, quelque chose souscrit à l'événement pour effectuer le travail. Je suis également en train de jeter l'état de l'objet passé à ma méthode Begin, en faveur de passer le gestionnaire d'événements en tant qu'état afin que j'y accède pour appeler EndInvoke.

Est-ce une option viable? (J'ai une connaissance et une compréhension limitées de la façon dont l'objet AsyncResult et la programmation asynchrone fonctionnent en général.)

Répondre

0

Extraction des extensions réactives pour .NET (Rx). C'est an implementation du motif que vous cherchez.

Compte tenu example:

var client = new WebClient(); 
var searchUri = new Uri("http://search.twitter.com/search.json?q=4sq.com"); 
var uploadUri = new Uri("http://localhost:8080/uploads"); 

IObservable<Unit> query = 
    from result in client.DownloadStringAsObservable(searchUri, new object()) 
    let transformed = TransformResult(result) 
    from upload in client.UploadStringAsObservable(
     uploadUri, 
     "POST", 
     transformed, 
     new object()) 
    select upload; 

var subscription = query.Subscribe(
    x => {}, // Nothing to do 
    exn => 
    { 
     // Do something with the exception 
    }, 
    () => 
    { 
     // Indicate we're finished 
    }); 
+0

Merci, qui semble intéressant, mais pas applicable à mon programme que je fais un service WCF/WCF mise en œuvre de rappel du client, pas un service Web à un point final JavaScript. –

+0

Cela fonctionne partout où ils sont implémentés. IObservable – AdamSane

+0

En sortie de boîtier, ils prennent en charge les connexions WCF. J'ai posté un exemple de téléchargement depuis un site Web. Je n'ai pas un exemple de WCF à portée de main mais le code est presque le même. Appelez simplement Subscribe sur l'objet client wcf, il vous donnera les gestionnaires (item, exception, finished). Ils l'ont porté en javascript. – AdamSane

0

Oui, je suis en train de faire la même chose avec le motif début/fin. Il ressemble à ceci:

public IAsyncResult BeginInsertWorkOrder(Dictionary<String, String> workOrderData, AsyncCallback callBack, Object state) 
{ 
    Action<Dictionary<String, String>> command = new Action<Dictionary<String, String>>(InsertWorkOrder); 
    return command.BeginInvoke(workOrderData, callBack, command); 
}