Suche…


Bemerkungen

Ein Synchronisierungskontext ist eine Abstraktion, die es dem Benutzer ermöglicht, Code zu verwenden, um Arbeitseinheiten an einen Scheduler zu übergeben, ohne sich dessen bewusst zu sein, wie die Arbeit geplant wird.

Synchronisierungskontexte werden normalerweise verwendet, um sicherzustellen, dass Code in einem bestimmten Thread ausgeführt wird. In WPF- und Winforms-Anwendungen wird vom Präsentations-Framework ein SynchronizationContext bereitgestellt, der den UI-Thread darstellt. Auf diese Weise kann SynchronizationContext als Erzeuger-Konsument-Muster für Delegierte betrachtet werden. Ein Arbeiter - Thread erzeugen , ausführbaren Code (der Delegierten) und oder den Verbrauch von der UI Nachrichtenschleife Warteschlange.

Die Task Parallel Library bietet Funktionen zum automatischen Erfassen und Verwenden von Synchronisationskontexten.

Führen Sie den Code im UI-Thread aus, nachdem Sie die Hintergrundarbeit ausgeführt haben

In diesem Beispiel wird veranschaulicht, wie eine UI-Komponente mithilfe eines SynchronizationContext von einem Hintergrund-Thread aktualisiert wird

void Button_Click(object sender, EventArgs args)
{
    SynchronizationContext context = SynchronizationContext.Current;
    Task.Run(() =>
    {
        for(int i = 0; i < 10; i++) 
        {
            Thread.Sleep(500); //simulate work being done
            context.Post(ShowProgress, "Work complete on item " + i);
        }
    }
}

void UpdateCallback(object state)
{
    // UI can be safely updated as this method is only called from the UI thread
    this.MyTextBox.Text = state as string;
}

Wenn Sie in diesem Beispiel versucht haben, MyTextBox.Text direkt in der for Schleife zu aktualisieren, erhalten Sie einen Thread-Fehler. Durch das Posten der UpdateCallback Aktion im SynchronizationContext wird das Textfeld in demselben Thread wie der Rest der Benutzeroberfläche aktualisiert.

In der Praxis sollten Fortschrittsaktualisierungen mithilfe einer Instanz von System.IProgress<T> . Die Standardimplementierung System.Progress<T> erfasst automatisch den Synchronisationskontext, für den sie erstellt wird.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow