Dans le cas de Windows, lorsqu'un contrôle est créé, les mises à jour de l'interface utilisateur sont effectuées via des messages provenant d'une pompe de message. Le programmateur n'a pas de contrôle direct du thread sur lequel la pompe fonctionne, donc l'arrivée d'un message pour un contrôle pourrait éventuellement entraîner le changement de l'état du contrôle. Si un autre thread (que le programmeur était en contrôle direct) était autorisé à changer l'état du contrôle, alors une sorte de logique de synchronisation devrait être mise en place pour empêcher la corruption de l'état du contrôle. Les contrôles dans .Net ne sont pas thread-safe; C'est, je suppose par conception. Mettre la logique de synchronisation dans tous les contrôles serait coûteux en termes de conception, de développement, de test et de support du code qui fournit cette fonctionnalité. Le programmeur peut bien sûr fournir la sécurité de thread au contrôle pour son propre code, mais pas pour le code qui est en .Net qui est en cours d'exécution en même temps que son code. Une solution à ce problème consiste à limiter ces types d'actions à un thread et à un thread uniquement, ce qui simplifie le maintien du code de contrôle dans .Net.
Je crois que l'une des raisons pour lesquelles cette restriction existe est qu'il n'y a toujours pas plus et pas moins d'un thread garanti d'être à l'écoute de la boucle de message Windows. –
@Tim: Ce n'est pas vrai, plusieurs threads d'interface utilisateur peuvent exister, chacun avec sa propre boucle de message. Par exemple, il est possible de lancer un deuxième thread pour afficher une boîte de dialogue de progression. –
@Ben: cet article est étiqueté avec C#. Dans une application .Net, vous devez toujours ramener le contrôle à l'unité d'exécution de l'interface graphique pour effectuer un travail lié au dessin (ou risque de comportement erratique ou une exception). Bien sûr, cela ne vous empêche pas de générer un nombre illimité de threads pour effectuer un travail en arrière-plan. En ce qui concerne l'écoute des messages Win32 entrants réels, la seule façon que je sais de le faire (en dehors d'un appel externe) est avec "protected override void WndProc (ref Message m)". En théorie, pourrait prendre les messages transmis à cette méthode et les utiliser sur n'importe quel thread. –