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

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top