Sie könnten Ihren eigenen Code threadsicher machen, aber es gibt keine Möglichkeit für Sie, die notwendigen Synchronisationsgrundelemente in den eingebauten WinForm- und WPF-Code zu injizieren, die mit denen in Ihrem Code übereinstimmen. Denken Sie daran, dass hinter den Kulissen viele Nachrichten herumgereicht werden, die schließlich dazu führen, dass der UIhread auf das Steuerelement zugreift, ohne dass Sie es jemals wirklich bemerken.
Ein weiterer interessanter Aspekt einer Steuer-Thread-Affinität ist, dass es könnte (obwohl ich vermute, dass sie nie würde) verwenden Sie die Thread Local Storage Muster. Wenn Sie auf ein Steuerelement in einem anderen Thread als dem, auf dem es erstellt wurde, zugegriffen haben, ist es natürlich nicht möglich, auf die richtigen TLS-Daten zuzugreifen, ganz gleich, wie sorgfältig Sie den Code strukturiert haben, um alle normalen Multithread-Probleme zu vermeiden.
Ich glaube einer der Gründe, warum diese Einschränkung besteht, ist, dass es immer nicht mehr und nicht weniger als einen Thread gibt, der garantiert die Windows-Nachrichtenschleife abhören kann. –
@Tim: Das ist nicht richtig, mehrere UI-Threads können existieren, jeder mit seiner eigenen Nachrichtenschleife. Zum Beispiel ist es erlaubt, einen zweiten Thread hochzufahren, um einen Fortschrittsbalken-Dialog anzuzeigen. –
@Ben: Dieser Beitrag ist mit C# getaggt. In einer .NET-Anwendung müssen Sie die Steuerung immer wieder an den GUI-Thread übergeben, um zeichnungsbezogene Arbeiten auszuführen (oder riskantes Verhalten oder eine Ausnahme zu riskieren). Dies schließt natürlich nicht aus, dass Sie eine beliebige Anzahl von Threads erzeugen, um Hintergrundarbeit zu leisten. In Bezug auf das Abhören der tatsächlichen eingehenden Win32-Nachrichten ist der einzige Weg, den ich weiß, dies zu tun (abgesehen von einem externen Anruf) mit "protected override void WndProc (ref Message m)". Theoretisch könnte man die an diese Methode übergebenen Nachrichten übernehmen und sie für jeden Thread verwenden. –