10
votes

Comment créer un iAsyncresulte qui complète immédiatement?

Je suis implémentant une interface qui nécessite des implémentations de Begindosomething et enddosomething méthodes. Cependant, mon Dosomething n'est pas vraiment longuement. Pour la simplicité suppose dosomething compare seulement deux variables et revenez si un> B

donc mon commençant doit être comme: xxx

Je ne fais pas savoir ce que je devrais revenir. Je n'applique que Begindosomething car je dois, non pas parce que ma méthode est longue. Dois-je mettre en œuvre mon propre iAsyncResult ? Y a-t-il une implémentation déjà dans les bibliothèques ?NET?


0 commentaires

4 Réponses :


6
votes

Ceci est un peu rapide et sale, mais vous pouvez mettre en œuvre une classe qui implémente iAsyncResult comme SO:

    return new MyAsyncResult(a > b);


4 commentaires

Je pense que la propriété asyncwaithandle doit renvoyer une référence à un Set manuelResetevent (ou similaire). Il est parfaitement raisonnable pour les clients d'essayer d'attendre la poignée et cela ne devrait pas provoquer une exception.


Certes, nous pourrions faire cela, mais comme un gaithandle est un objet coûteux, il semble gaspillé de créer un quand il sera jamais pertinent.


Le code manque l'appel de rappel, requis (s'il n'est pas null).


Aww, ⁺¹, il faut mettre en œuvre uniquement des getters ... ce n'est pas évident, je ne pouvais pas comprendre pourquoi Bool public est composé ne peut être mentionné comme non implémenté.



6
votes

La façon de faire de la tâche rapide est d'utiliser un délégué: XXX

La vocation de cette approche est que vous devez faire attention si deux threads appelleront cette méthode simultanément 'll obtenir une erreur.


4 commentaires

Pas réellement rapide mais difficile à argumenter avec la simplicité. Omettre le retourvalue. Je ne vois pas l'erreur.


Que devrait être dans le enddosomething alors? Je suis désolé je suis très nouveau sur la programmation asynchrone


En fin de compte *, ce serait la même chose que Func.begininvoke: iAsyncreulsulte, vous devez donc déléguer la responsabilité de la mise en œuvre de déléguer.


func.endinvoke? Mais Func n'est déclaré que dans la méthode de début *, on ne peut pas être appelé à la fin *



1
votes

Je ne suis pas sûr que je ne manque pas quelque chose, mais aujourd'hui, vous pouvez simplement revenir taskPletedtask code> / tâche.fromResult code>. Tâche Code> Implements iAsyncResult CODE>

protected override IAsyncResult BeginDoSomething(int a, int b, AsyncCallback callback, object state)
{
     return Task.FromResult(a > b);
}


0 commentaires

0
votes

Je vous suggère de suivre les instructions ICI Pour pouvoir créer vos implémentations à l'aide de méthodes basées sur les tâches au cas où l'un d'entre eux s'avère être longue. Si Dosomething est courte en cours d'exécution, vous pouvez le bloquer en créant une tâche à partir de son résultat xxx


0 commentaires