2010-09-13 18 views
4

Après avoir lu un recent MSDN Magazine article about the Task scheduler j'espérais (et en fait très excité) que l'utiliser serait bénéfique pour mon utilisation des proxies générés par WCF.Existe-t-il un moyen efficace d'utiliser System.Threading.Tasks avec les proxys de service WCF?

J'espérais obtenir quelques-uns des avantages suivants:

  • 1) Possibilité d'interrompre une opération de WCF en cours d'exécution (je ne m'y attendais pas pour arrêter l'opération sur le serveur - je voudrais juste comme être capable de signaler que «je ne veux pas le résultat pour cette tâche.» Ceci est particulièrement courant dans l'IU où quelqu'un sélectionne à plusieurs reprises des éléments d'une grille qui déclenchent des appels de service.)
  • 2) Capacité à démarrer une tâche à un moment autre que quand il a été créé - Je ne suis pas sûr de vraiment besoin cela, je pensais juste qu'il pourrait être agréable de générer une tâche et ne pas l'exécuter immédiatement. Après tout, je pensais que c'était tout le but des tâches.
  • 3) propriétés Bindable - afin que je puisse lier mon interface utilisateur WCF à IsCompleted et laisser la classe Tâche abstraction de l'interne de l'opération à partir de mon interface utilisateur.
  • 4) Capacité à abstraire le déroulement de l'opération - se moquant, bla bla bla, futur refactorisation etc.

Cependant - je ne semble pas obtenir de ces avantages.

  • 1) Il n'y a aucune fonctionnalité d'abandon dans la tâche - ce qui me semble vraiment étrange.
  • 2) La seule surcharge que je pourrais avoir avec Task.Factory.FromAsync<> est celle montrée ci-dessous. Cela commence immédiatement l'exécution de l'opération webservice (comme vu dans Fiddler) et ne me laisse pas commencer l'appel plus tard.
  • 3) La tâche n'implémente pas INotifyPropertyChanged donc je ne peux pas le lier à l'interface utilisateur.
  • 4) Celui-ci est une sorte de mort dans l'eau étant donné les 3 autres avantages ne se passent pas :-(

Sooo .... Suis-je juste perdre mon temps à essayer d'obtenir WCF généré travail proxies avec des tâches -. ou suis-je manque quelque chose

// WCF client 
var client = new ShoppingCartClient(); 

// create task 
var t = Task.Factory.FromAsync<GetOrderDetailsMsgOut>(
       client.BeginGetOrderDetails(new GetOrderDetailsMsgIn() 
       { 
        OrderId = 12345 
       }, null, null),  
       client.EndGetOrderDetails); 

t.ContinueWith(x => 
{ 
    var order = x.Result.Order; 
    // do something with order 
}); 
+0

À votre avis, quelle est la différence entre la fonctionnalité Abort que vous recherchez et la fonctionnalité Annuler présente dans Tâche? –

+0

@john - exactement la même chose - mais il n'y a pas de méthode Cancel() non plus. il existe une méthode IsCancelled, mais pas Cancel(). Bien que je vois maintenant que je peux annuler en utilisant un jeton d'annulation http://msdn.microsoft.com/en-us/library/dd997364.aspx –

+1

CancellationToken est le moyen de faire une annulation. –

Répondre

1

en tant que partie des nouvelles fonctionnalités Async Microsoft sont la planification de la prochaine version de C#, ils ont sorti un CTP here, il est compatible avec VS 2010 SP1.

Il y a quelques temps allez, j'ai écrit un petit billet de blog sur l'un des exemples qui est livré avec le CTP, sur le TaskWsdlImportExtension.