délai d'attente pour la méthode sur le thread d'interface utilisateur
-
03-07-2019 - |
Question
J'ai le problème de l'instanciation d'un objet sur le thread d'interface utilisateur (WinForms). La création d'objet prend probablement beaucoup de temps et j'aimerais avoir une sorte de "délai d'attente". pour cette méthode (parce que cela bloque mon application).
Mes problèmes sont les suivants: 1. l'objet doit être créé sur le thread d'interface utilisateur 2. L'objet est un objet étranger et je n'ai aucun accès à la source. Je ne peux donc pas le modifier.
La question serait donc de savoir si quelqu'un a une idée créative, s'il est possible de créer une logique qui stoppe l'exécution de la méthode si un délai est atteint?
tia Martin
La solution
Voici une mauvaise solution. Utilisez un thread de travail sur une minuterie pour surveiller le thread d'interface utilisateur. Si le délai est écoulé avant la création de l'objet, appelez Abort
sur le thread de travail sur le thread d'interface utilisateur. Cela déclenchera une ThreadAbortException
dans le thread d'interface utilisateur que vous devez intercepter. La raison en est que cela peut être mauvais, car votre programme peut se bloquer ou tomber en panne en fonction de conditions de course et de minutage subtiles lorsque l’exception est levée.
Un "plus sûr" La méthode consiste à appeler le travailleur Interrupt
- une exception ThreadInterruptedException
sera déclenchée dans le thread de l'interface utilisateur, mais uniquement dans l'état WaitSleepJoin
- si le thread ne dort jamais, il n'interrompra pas, mais au moins il ne bloquera pas ni ne corrompra pas la mémoire.
Autres conseils
Pas vraiment; surtout si vous n'avez pas accès à la source.
Même si vous le pouviez, ce n'est pas une bonne idée d'interrompre de force le code sans raison valable - cela ne peut qu'engendrer des problèmes (fuites, verrous verrouillés, etc.).
Faut-il que ce soit le même même thread d'interface utilisateur? Vous pourriez générer un deuxième thread d'interface utilisateur pour posséder ce code? Il obtient un petit scrappy, mais peut fonctionner.
si vous utilisez BeginInvoke, le IAsyncResult a un handle d'attente sur lequel vous pouvez WaitOne (délai d'attente) - à partir du thread non-UI.
Malheureusement, à l'expiration du délai imparti, il n'existe aucun moyen propre d'annuler ce BeginInvoke. Vous pouvez donc essayer la solution de 1800 INFORMATION
.