2010-07-26 2 views
2

Je travaille sur une application WPF qui utilise une couche BusinessLogic (actuellement une seule DLL) dans laquelle j'ai créé mes méthodes BL qui seront appelées directement depuis l'interface utilisateur. Chaque gestionnaire BL est résolu avec Unity (en pensant à passer au MEF si ...). Les classes BL implémente une interface spécifique qui a bien sûr des méthodes appropriées. Maintenant, ce que je veux, c'est créer (ou plutôt GENERER) un nouvel assemblage de type asynchrone (ou plus ...) qui devrait avoir des méthodes/opérations similaires à celles de mon assemblage d'origine (les mêmes paramètres ...) et aussi un délégué de rappel en tant que paramètre. Donc, fondamentalement, je veux des méthodes async à générer avec un certain cadre là ...Appels de méthode asynchrones générés en C# - AOP?

Outre l'appel habituel de: utilisateur userBO = resolve() Connexion (« nom », « pass »);. Je voudrais utiliser quelque chose de similaire avec: Resolve() Connexion ("nom", "pass", délégué (objet, SomeArgs e) {User userBO = ....} de e.Args;

. Maintenant, je veux que cet assembly soit généré au lieu d'écrire de nouveaux eventArgs et délégués pour chaque méthode Je suis conscient que PostSharp pourrait aider à la tâche AOP, mais je n'ai rien trouvé concernant ce mécanisme de génération de code dans un nouveau DLL pour asynchrone méthodes.

est-il un moyen d'y parvenir à l'aide d'un outil tiers ou dois-je réécrire toute chose async? manuellement

Toutes les idées sont les bienvenues. Merci.

+0

Vous pouvez toujours écrire votre propre outil pour créer des paires de méthodes BeginXXX EndXXX et les placer dans une classe partielle - similaire au fonctionnement du code de référence du service Web. La plomberie du code est en grande partie la même, est donc un candidat idéal pour l'automatisation. Je ne connais pas d'outil tiers de la tête à cette fin. –

Répondre

2

Je ne suis pas au courant d'un outil qui fera cela pour vous, mais il existe un moyen facile de les emballer dans Task objets. Ceci est plus facile au moins que de définir manuellement les méthodes Async et event.

Le concept général consiste à exécuter la méthode en tant que Task, puis à planifier une continuation de tâche vers le thread d'interface utilisateur.

D'abord, définir un planificateur (vous n'êtes pas obligé de le faire à chaque fois, cela pourrait être une variable globale ou une fenêtre de niveau var):

TaskScheduler ui = TaskScheduler.FromCurrentSynchronizationContext(); 

alors quand vous voulez appeler une méthode et gérer sa valeur de retour:

var bll = Resolve(); 
Task.Factory.StartNew(_ => bll.Login("name", "pass")) 
    .ContinueWith(task => 
    { 
    // Note: accessing Result will raise any exceptions thrown by Login 
    User userBO = task.Result; 
    ... 
    }, ui); 

Ce n'est pas aussi joli que votre syntaxe suggérée, mais il est utilisable. La continuation de la tâche transmise à ContinueWith s'exécute sur le thread d'interface utilisateur. Il est donc sûr de mettre à jour l'interface utilisateur ou tout objet de databound.

Task Les objets prennent également entièrement en charge d'autres scénarios asynchrones courants, en particulier les rapports d'annulation et de progression.

Étant donné que cette approche n'ajoute pas réellement d'événements à la classe, il devrait être possible d'écrire un modèle T4 pour générer des méthodes d'extension pour vous (par exemple, LoginTask(string username, string password, Action<Task<User>> continuation)).

+0

Cela semble intéressant - comment se comporte-t-il lorsque la tâche est bloquante? Est-ce que l'interface utilisateur bloque? –

+0

Merci les gars pour l'info, je vais devoir creuser dans les modèles T4. Jusqu'à présent, je les ai seulement utilisés dans EF. Je pensais sur les interfaces asynchrones en raison du sucre synthactique qu'il fournit: IUser blUser = Résoudre(). Connexion (...) puis IUserAsynchronous = Résoudre(). LoginAsync (...., callback) ... –

+0

I crois que je vais écrire cet outil moi-même .. Ce serait bien si cet outil créerait des méthodes asynchrones chaque fois que je créerais une nouvelle méthode BL par exemple et que je construirais le projet. juste des pensées ... Alors que la sortie async dll contiendrait aussi la méthode async appropriée .... –

Questions connexes