2009-04-02 7 views
1

Supposons que j'ai l'événement button.Click normal.Pourquoi le thread d'interface utilisateur est-il bloqué lors de l'exécution de quelque chose dans un thread différent?

Si j'essaie d'accéder à des éléments de l'interface utilisateur depuis l'intérieur de cet événement, je pourrais potentiellement avoir un comportement indésirable - ou même une exception (lors du débogage). L'exception habituelle dans un tel scénario est: ...cannot access UI elements from thread different than they were created in.

Puisqu'il s'agit d'un autre thread (différent du principal), pourquoi mon interface utilisateur est-elle bloquée lorsque j'effectue des opérations fastidieuses dans un événement?

Répondre

3

Quel est le cadre ici? winform? WPF?

En winform (pour un événement click), correspond à sur le thread d'interface utilisateur. Donc vous pouvez juste parler à l'interface utilisateur de l'événement click. Si quelque chose d'autre se passe, alors il y a quelque chose qui ne va pas. Etes-vous sûr que vous n'êtes pas dans un rappel de minuterie?

Dans le sens le plus général, vous pouvez utiliser InvokeRequired/Invoke etc pour transmettre le contrôle au thread UI.

+0

Comment pouvez-vous dire que certains événements s'exécutent dans le thread UI et d'autres pas? – pkolodziej

+1

En lisant la documentation de l'événement. La plupart des événements liés à l'interface utilisateur se déclenchent sur le thread d'interface utilisateur. En cas de doute, vérifiez InvokeRequired. –

+0

Si l'événement se déclenche dans le thread AUTRE que l'interface utilisateur, il n'empêche pas l'actualisation de la fenêtre, mais si elle se déclenche dans le thread UI, la fenêtre ne sera pas redessinée jusqu'à la fermeture de l'événement. – pkolodziej

Questions connexes