appeler une fonction et ne jamais l'attendre en C #


26

J'ai un contrôleur dans mon application Web mvc4 dans lequel il y a une action qui doit appeler une autre fonction. Ce qui se passe dans cette fonction, c'est-à-dire que la valeur de retour n'est pas importante pour mon action. Comment puis-je appeler cette fonction et ne jamais attendre qu'elle soit exécutée?

Je pense que cela peut être fait par async mais mon but n'est pas d'utiliser les ressources, il suffit d'appeler la fonction et de ne jamais l'attendre.

Veuillez me donner quelques conseils.



La seule façon de le faire est de le passer à un autre thread. Il n'y a rien de tel que d'appeler une fonction sans ressources, sauf si vous voulez juste que ce soit un no-op.
Robert Harvey

merci, je voulais dire quel est le meilleur moyen et optimisé, je pense que le meilleur moyen est Task.Run et en utilisant WebApi dans MVC, basé sur le lien @ user814064 mentionné, peut-être que je peux simplement utiliser une solution javascript, mais je pense que ce n'est pas professionnel!
user2675751

Réponses:


40
private void Demo()
{
    // Do something, given that the result doesn't matter.
}

public void Do()
{
    Task.Factory.StartNew(this.Demo);

    // The following line will be executed without waiting for the result.
    DoSomethingElse();
}

Notez que démarrer une méthode sans se soucier du résultat ou des exceptions qu'elle peut lancer est risqué.

Si une exception est levée dans a Task, elle sera masquée jusqu'à ce que vous:

  1. Observez le résultat,
  2. Wait() pour la tâche, ou:
  3. Le GC appelle le finaliseur le Task.

Vous pouvez vous gérer 1. et 2. peu de temps après avoir appelé la méthode, ou vous pouvez attacher une continuation myTask.OnComplete(myErrorHandler, TaskContinuationOptions.OnlyOnFaulted)à exécuter lorsque la tâche d'origine lève une exception. 3. plantera votre processus; ne fais pas ça.


3
Pourriez-vous développer sur "3. plantera votre processus; ne faites pas cela". N'est-ce pas fait automatiquement?
rdans
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.