2012-05-06 1 views
1

Dans notre application, nous utilisons TPL pour créer des tâches chaque fois que nous voulons effectuer un appel de service.Nous avons un indicateur occupé qui est défini sur vrai à chaque démarrage d'une tâche et effacé chaque fois que la tâche est terminée ou en panne. Existe-t-il un moyen d'accomplir ceci de manière générique au lieu de le faire pour chaque tâche créée?Centraliser avant et après les actions autour d'une nouvelle tâche créée par TPL

première instance:

 ComponentViewModel.Instance.IsApplicationBusy = true; 
     ComponentViewModel.Instance.BusyMessage = "Loading..."; 

     var task1 = Task.Factory.StartNew(() => DoTask1()); 
     task1.ContinueWith(antecdent => 
     { 
      ComponentViewModel.Instance.IsApplicationBusy = false; 
      CustomAction1(); 
     } 

Deuxième instance:

 ComponentViewModel.Instance.IsApplicationBusy = true; 
     ComponentViewModel.Instance.BusyMessage = "Loading..."; 

     var task2 = Task.Factory.StartNew(() => DoTask2()); 
     task2.ContinueWith(antecdent => 
     { 
      ComponentViewModel.Instance.IsApplicationBusy = false; 
      CustomAction2(); 
     } 

même est logique se répète à travers l'application chaque fois qu'un appel de service est fait est-il un moyen d'éviter cette répétition? Par exemple, il y a des événements dragstarted et dragcompleted qui sont déclenchés pour toutes les opérations de glissement, de sorte qu'il est possible que l'événement taskstarted et taskcompleted soit éventuellement étendu par l'extension de la fabrique de tâches ou autrement?

Modifier: Les modifications apportées pour que la question est plus clear.You peut maintenant observer que les étapes avant de commencer et terminer une tâche est la même, mais les différentes fonctions doivent être exécutées pour chaque tâche quand il court à la fin

Répondre

0

EDIT : Il semble que j'ai mal compris la question. La création de cette « start, attendez, continuer » en fonction centralisée est une bonne chose, et pourrait être créé comme ceci:

public void DoIt(Action ThingToDo) { 
    ComponentViewModel.Instance.IsApplicationBusy = true; 
    ComponentViewModel.Instance.BusyMessage = "Loading..."; 

    var loadProviderTask = Task.Factory.StartNew(ThingToDo); 
    loadProviderTask.ContinueWith(antecdent => 
    { 
     ComponentViewModel.Instance.IsApplicationBusy = false; 
    } 
} 
+0

Salut, Désolé que ma question n'a pas été clear.I avoir modifié le question.I veulent différents fonctions à exécuter après l'achèvement de la tâche –

+0

@VasudevanKannan, puis passez-le comme un autre argument délégué à la fonction et invoquez-le dans la continuation. – svick

+0

@robrich, vouliez-vous dire 'Task.Factory.StartNew (ThingToDo)'? En outre, la convention de dénomination habituelle dans .Net consiste à démarrer les paramètres avec une lettre minuscule. – svick

Questions connexes