Question

J'ai assez bien WinForms multi-thread application qui utilise le EventWaitHandle dans un certain nombre d'endroits pour synchroniser l'accès.

J'ai donc un code similaire à ceci:

List<int> _revTypes;
EventWaitHandle _ewh = new EventWaitHandle(false, EventResetMode.ManualReset);

void StartBackgroundTask() {
    _ewh.Reset();
    Thread t = new Thread(new ThreadStart(LoadStuff));
    t.Start();
}

void LoadStuff() {
    _revTypes = WebServiceCall.GetRevTypes()
    // ...bunch of other calls fetching data from all over the place
    // using the same pattern
    _ewh.Set();
}


List<int> RevTypes {
    get {
        _ewh.WaitOne();
        return _revTypes;
    }
}

Je viens d'appeler .RevTypes somewehre de l'interface utilisateur et il retournera me données lorsque LoadStuff a terminé son exécution.

Tout cela fonctionne parfaitement bien, mais RevTypes est juste une propriété - il y a en fait plusieurs dizaines de ces derniers. Et un ou plusieurs de ces propriétés se maintiennent l'interface de chargement d'une manière rapide.

Court de placer le code de référence dans chaque propriété, est-il un moyen de voir quelle propriété détient l'interface de chargement? Est-il possible de voir si le EventWaitHandle est forcé d'attendre réellement?

Était-ce utile?

La solution

Je ne sais pas quoi et comment vous voulez atteindre, mais vous pouvez faire défiler les WaitHandles avec un délai d'attente de 0 pour voir si elles sont actuellement définies comme:

class Program
{
    static void Main(string[] args)
    {
        EventWaitHandle[] waitHandles = new EventWaitHandle[3];
        for (int i = 0; i < 3; i++)
        {
            waitHandles[i] = new EventWaitHandle(false, EventResetMode.ManualReset);
        }
        waitHandles[1].Set();

        for (int i = 0; i < 3; i++)
        {
            if (waitHandles[i].WaitOne(0))
            {
                Console.WriteLine("Handle {0} is set", i);
            }
            else
            {
                Console.WriteLine("Handle {0} is not set", i);
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top