Nous avons un code en cours d'exécution dans un thread d'arrière-plan qui doit faire apparaître une boîte de dialogue ou d'une autre interaction de l'utilisateur, donc nous l'appel Invoke
habituelle sur le thread d'interface utilisateur:Invoke avec délai d'attente
Control.Invoke(SomeFunction);
void SomeFunction()
{
...
}
Mais, nous est tombé sur un bug, notre thread UI ne répond parfois pas immédiatement à l'appel Invoke
- nous l'avons dépisté au fait que le thread de l'interface utilisateur effectuait actuellement un appel DCOM inter-processus qui n'était pas encore retourné. Une fois l'appel DCOM retourné, notre fonction serait appelée, mais jusque-là il est apparu que l'appel Invoke
avait été bloqué.
Ma solution pour cela était d'introduire un délai d'attente:
ManualResetEvent invokeEvent = new ManualResetEvent();
var result = Control.BeginInvoke(SomeFunction, invokeEvent);
if (!invokeEvent.WaitOne(1000))
throw new Exception("Not responding");
Control.EndInvoke(result);
void SomeFunction(ManualResetEvent invokeEvent)
{
invokeEvent.Set();
...
}
Cela a fonctionné dans les « travaux sur mon sens de la machine », mais il y avait un certain nombre de défauts.
http://www.codinghorror.com/blog/images/works-on-my-machine-stamped.png
- Tout d'abord la fonction est toujours invoquée, même si le délai d'attente se produit - si l'appel avait pas réellement DCOM complètement accroché, il finira par fonctionner
- En second lieu, il y a la course terrible évidente état
- Enfin, il y a toute « Arrgh » ness de la chose
Même si les deux premières choses pourraient être résolus, nous avons encore le gen ickyness eral. Y a-t-il une meilleure façon de résoudre cela?
Je suis désolé de dire que nous ne possédons pas le code qui rend l'appel DCOM inter-processus. Même si nous le faisions, nous aurions toujours besoin de résoudre ce problème en tant que problème général dans notre propre code car tout autre code pouvant être chargé pourrait causer ce problème général. Bonne idée cependant –