Je n'arrive pas à comprendre pourquoi IAsyncResult est une interface au lieu d'un simple objet. Si je me souviens bien, l'interface ne contient que des noms de méthodes sans implémentation, donc je ne vois pas comment elle est utilisée ici car je n'en dérive aucune classe et ne remplace pas ses méthodes. Je suis juste confus .. MerciIasyncresult - pourquoi ce n'est pas juste un objet, pourquoi c'est une interface?
Répondre
Comme ceci, le résultat peut être n'importe quel type d'objet, qui implémente l'interface IAsyncResult.
Vous avez raison qu'une interface ne contient que des méthodes/propriétés sans implémentation. Dans ce cas, il est garanti que l'objet AsyncResult contient les méthodes nécessaires au 'Async-framework'.
IAsyncResult contient quatre propriétés:
- AsyncState (Object)
- AsyncWaitHandle (WaitHandle)
- completedSynchronously (Boolean)
- IsCompleted (Boolean)
Ces propriétés sont simplement nécessaire lorsque vous travaillez avec des méthodes asynchrones. Si ce serait un objet, vous seriez moins flexible je pense.
Si elle était juste un objet, il pourrait être quelque chose - et vous pourriez pas compter sur certaines propriétés et/ou des méthodes être présente, comme vous pouvez quand vous savez que vous obtenez un objet qui implémente l'interface IAsyncResult
.
Puisque l'objet que vous obtenez doit être de retour implémentant l'interface en question, vous pouvez compter sur le fait que les propriétés AsyncState
, AsyncWaitHandle
, CompletedSynchronously
et IsCompleted
seront présents.
Si vous aviez juste un objet et vous êtes revenu un int
- comment obtiendriez-vous ces propriétés dont vous avez besoin ??
Parce qu'un "ASyncResult" n'est en soi rien de concret. Parce que C# n'autorise que l'héritage unique, en le rendant une interface, vous pouvez l'implémenter sur n'importe quel type d'objet que vous choisissez.
Par exemple, si je me retourne méthode de type Foo, je peux créer un type de retour async pour mon application simplement en créant une sous-classe en disant
FooAsync : Foo, IAsyncResult
Et tout simplement jeté comme un code d'écriture plutôt que d'extraire des valeurs.
duplication possible de [Pourquoi BeginInvoke ne renvoie pas de référence de type AsyncResult?] (Http://stackoverflow.com/questions/2352161/why-doesnt-begininvoke-return-reference-of-type-asyncresult) –