2009-04-02 2 views
1

Angenommen, ich habe normalen button.Click Ereignis.Warum wird der UI-Thread blockiert, wenn etwas in einem anderen Thread ausgeführt wird?

Wenn ich versuche, innerhalb dieses Ereignisses auf UI-Elemente zuzugreifen, könnte ich möglicherweise unerwünschtes Verhalten bekommen - oder sogar eine Ausnahme (beim Debuggen). Die übliche Ausnahme in einem solchen Szenario ist: ...cannot access UI elements from thread different than they were created in.

Da dies ein anderer Thread (anders als die Haupt) ist, warum meine Benutzeroberfläche blockiert ist, wenn ich zeitraubende Operationen in einem Ereignis durchführen?

Antwort

3

Was ist der Rahmen hier? Winform? WPF?

In Winform (für ein Klickereignis) sind Sie auf dem UI-Thread. So können Sie können nur mit der Benutzeroberfläche von der Click-Ereignis sprechen. Wenn etwas anderes passiert, dann stimmt etwas nicht. Sind Sie sicher, dass Sie nicht in einem Timer-Rückruf sind?

Im allgemeineren Sinne können Sie InvokeRequired/Invoke usw. verwenden, um die Steuerung an den UI-Thread zu übergeben.

+0

Wie können Sie feststellen, dass einige Ereignisse im UI-Thread und andere nicht ausgeführt werden? – pkolodziej

+1

Durch Lesen der Dokumentation für das Ereignis. Die meisten mit der Benutzeroberfläche verknüpften Ereignisse werden im UI-Thread ausgelöst. Wenn Sie sich nicht sicher sind, überprüfen Sie InvokeRequired. –

+0

Wenn das Ereignis im Thread anders als UI ausgelöst wird, verhindert es nicht, dass das Fenster aktualisiert wird, aber wenn es im UI-Thread ausgelöst wird, wird das Fenster nicht neu gezeichnet, bis das Ereignis schließt. – pkolodziej