Supposons, je l'interface IAsynchronous
qui prend en charge deux méthodes pour faire une opération ("début/fin" pattern):Appels asynchrones composés - comment?
IAsyncResult BeginOperation(AsyncCallback callback, object state)
EndOperation(IAsyncResult ar)
Supposons aussi que je le classes A : IAsynchronous
et B : IAsynchronous
. Je dois implémenter la classe Compound : IAsynchronous
. Le Compound
« de fonctionnement de est d'invoquer A
» opération s, attendre son achèvement, puis invoquer l » opération B
et ensuite invoquer le rappel comme d'habitude.
La question est de savoir comment concevoir la classe Compound
:
- je garderais l'objet
state
original et invoquer le rappel d'origine lorsque l'opération complète duCompound
. Ainsi, je ne peux pas simplement les passer àA.BeginOperation
ouB.BeginOperation
. - En outre,
Compound.EndOperation
devrait re-jeter une exception qui est jeté parA.EndOperation
ouB.EndOperation
. SiA.EndOperation
a levé une exception, l'opérationCompound
ne doit pas appelerB.EndOperation
car l'opération composée a déjà échoué. - Et s'il n'y a pas seulement 2 opérations internes, mais 3 ou plus? Y a-t-il un moyen commun?
Pour clarifier, considérons l'exemple suivant. Supposons, que nous avons la classe Multiplier
qui prend en charge les méthodes suivantes:
IAsyncResult BeginMultiply(LargeNumber x, LargeNumber y, AsyncCallback callback, object state)
LargeNumber EndMultiply(IAsyncResult ar)
Et vous voulez écrire la classe ThreeMultiplier
qui prend en charge les méthodes suivantes:
IAsyncResult BeginMultiply(LargeNumber x, LargeNumber y, LargeNumber z, AsyncCallback callback, object state)
LargeNumber EndMultiply(IAsyncResult ar)
La classe ThreeMultiplier
doit utiliser la classe Multiplier
pour calculer x * y * z
. Pour ce faire, il calcule d'abord x * y
(à travers Multiplier.Begin/EndMultiply
), puis multiplie le résultat par z
. Bien sûr, Multiplier.EndMultiply
peut lancer SomeException
qui échoue l'informatique de x * y * z
à n'importe quelle étape.
Quel est le meilleur (ou bien) façon de mettre en œuvre ce? Y a-t-il un motif?
Est-ce avec Visual Studio 2010? –
@PeterRitchie De préférence .NET 3.5 – eigenein