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
});
À votre avis, quelle est la différence entre la fonctionnalité Abort que vous recherchez et la fonctionnalité Annuler présente dans Tâche? –
@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 –
CancellationToken est le moyen de faire une annulation. –