Disons que j'ai une interface exposée en tant que telle:C# Threading Mécanisme
interface IMyService
{
MyResult MyOperation();
}
Cette opération est synchrone et retourne une valeur.
Mon interface implémentée doit effectuer les opérations suivantes:
- Appel d'une méthode asynchrone
- Attendez événement # 1
- Attendez événement # 2
Cela est dû à un Objet COM tiers avec lequel je travaille.
Ce code ressemble aux suivantes
public MyResult MyOperation()
{
_myCOMObject.AsyncOperation();
//Here I need to wait for both events to fire before returning
}
private void MyEvent1()
{
//My Event 1 is fired in this handler
}
private void MyEvent2()
{
//My Event 2 is fired in this handler
}
Mes deux événements peuvent se produire dans un ordre, il est tout à fait aléatoire.
Quel est le mécanisme d'enfilage approprié que je peux utiliser pour synchroniser ceci? J'utilisais ManualResetEvent avant de devoir attendre le second événement, et je n'ai pas vu un moyen facile de l'utiliser pour les deux événements. Ces 2 événements définissent des variables qui me permettent de créer la valeur de retour pour MyOperation().
Des idées sur une bonne implémentation pour cela? Je n'ai aucun contrôle sur la façon dont l'objet tiers est implémenté.
Ceci est logique. Ma confusion a menti sur l'endroit où appeler Reset() sur ManualResetEvents muliple, et je devrai également verrouiller l'appel entier à MyOperation() de sorte que 2 discussions ne puissent pas appeler la fonction en même temps. – jonathanpeppers
Bien que ce soit une solution parfaitement bien, j'utiliserais WaitAll (voir ci-dessous) au lieu de deux appels de blocage WaitOne, le WaitAll donne au système plus de contexte sur le blocage, et lui donne potentiellement la chance de mieux planifier. – meandmycode
Merci pour les commentaires. J'ai mis à jour ma réponse. –