2009-03-19 7 views

Antwort

2

Dies hängt vom Typ des Objekts ab, in dem Sie BeginInvoke aufrufen.

ISynchronizeInvoke ist die Schnittstelle, die BeginInvoke definiert. Er übergibt den Delegaten an das Objekt, das diese Schnittstelle implementiert, und dieses Objekt plant (sollte) den Thread so zu planen, dass er auf seinem eigenen Hauptthread ausgeführt wird.

Es gibt ein paar Objekte, die diese Schnittstelle implementieren. Der Dispatcher in WPF führt dies aus: Wenn Sie BeginInvoke für den Dispatcher aufrufen, wird der Delegat zur Warteschlange des Dispatchers hinzugefügt und ausgeführt, wenn es angemessen ist.

Die Control-Basisklasse in Windows Forms implementiert auch ISynchronizeInvoke (und ich glaube, das könnte sein, was Ihre Frage ansprach). In Windows Forms sind die Dinge viel komplizierter. Here is a great article erklären die Details. Wenn Sie BeginInvoke für ein Winforms-Steuerelement aufrufen, geschieht das im Grunde, dass ein spezieller Marshaller eine Windows-Nachricht erstellt, die an das Programm übergeben wird, und der UI-Thread stellt den auszuführenden Delegaten in eine Warteschlange. Es ist ein bisschen komplexer als das (wie dieser Artikel beschreibt), aber das ist die Grundidee. Der Delegat wird dann auf dem Hauptthread der Benutzeroberfläche ausgeführt.

Es gibt andere Objekte, die ISynchronizeInvoke implementieren, aber die meisten davon sind Objekte, die ihren eigenen Thread verwalten und ausführen. Diese Objekte verwalten eine Delegatenwarteschlange und fügen Ihre zu dieser Warteschlange hinzu, damit sie auf ihrem Thread ausgeführt wird.