Heim >Backend-Entwicklung >C++ >Wie aktualisiere ich eine Benutzeroberfläche sicher aus einem Hintergrundthread in einer anderen Klasse?

Wie aktualisiere ich eine Benutzeroberfläche sicher aus einem Hintergrundthread in einer anderen Klasse?

Susan Sarandon
Susan SarandonOriginal
2025-01-05 19:34:40466Durchsuche

How to Safely Update a UI from a Background Thread in Another Class?

So aktualisieren Sie die Benutzeroberfläche über eine Hintergrundaufgabe in einer anderen Klasse

Hintergrundaufgaben können langwierige Vorgänge ausführen, ohne dass die Benutzeroberfläche einfriert. Allerdings erfordert die Aktualisierung der Benutzeroberfläche über diese Aufgaben einen Cross-Thread-Mechanismus. In diesem Artikel wird erläutert, wie Sie dies mithilfe von Ereignissen und Delegaten erreichen.

Ereignisse und Delegaten verwenden

Um die Benutzeroberfläche über einen Hintergrundthread zu aktualisieren, können Sie Ereignisse und Delegaten verwenden. Ereignisse werden ausgelöst, wenn bestimmte Ereignisse eintreten, sodass Abonnenten als Reaktion vordefinierten Code ausführen können. Delegaten stellen Methoden dar, die in einem separaten Thread aufgerufen werden können.

Ereignisbasierter Ansatz

Bei diesem Ansatz löst der Hintergrundthread ein Ereignis aus, wenn die Benutzeroberfläche dies erfordert aktualisiert. Der Hauptthread abonniert dieses Ereignis und führt den entsprechenden UI-Aktualisierungscode aus. Hier ist ein Beispiel:

class MainWindow : Window
{
    private void startCalc()
    {
        // ...
        CalcClass calc = new CalcClass();
        calc.ProgressUpdate += (s, e) =>
        {
            Dispatcher.Invoke((Action)delegate() { /* Update UI */ });
        };
        Thread calcthread = new Thread(new ParameterizedThreadStart(calc.testMethod));
        calcthread.Start(input);
    }
}

class CalcClass
{
    public event EventHandler ProgressUpdate;

    public void testMethod(object input)
    {
        // ...
        if (ProgressUpdate != null)
            ProgressUpdate(this, new YourEventArgs(status));
        // ...
    }
}

Aufgabenbasierter Ansatz (C# 4.5 und höher)

Eine weitere Option ist die Verwendung von Aufgaben, die asynchrone Vorgänge darstellen. Aufgaben können mit der Task.Run-Methode erstellt werden und bieten eine saubere Möglichkeit, Code in einem separaten Thread auszuführen.

class MainWindow : Window
{
    Task calcTask = null;

    void buttonStartCalc_Clicked(object sender, EventArgs e) { StartCalc(); }
    async void buttonDoCalc_Clicked(object sender, EventArgs e)
    {
        await CalcAsync();
    }

    void StartCalc()
    {
        var calc = PrepareCalc();
        calcTask = Task.Run(() => calc.TestMethod(input));
    }
    Task CalcAsync()
    {
        var calc = PrepareCalc();
        return Task.Run(() => calc.TestMethod(input));
    }
    // ...
}

class CalcClass
{
    public event EventHandler<EventArgs<YourStatus>> ProgressUpdate;

    public TestMethod(InputValues input)
    {
        // ...
        ProgressUpdate.Raise(this, status);
        // ...
    }
}

Fazit

Beide Ereignis- Es können aufgabenbasierte und aufgabenbasierte Ansätze verwendet werden, um die Benutzeroberfläche über einen Hintergrundthread zu aktualisieren. Der ereignisbasierte Ansatz ist einfacher, aber der aufgabenbasierte Ansatz bietet eine bessere Kontrolle und Fehlerbehandlung. Wählen Sie den Ansatz, der Ihren spezifischen Anforderungen am besten entspricht.

Das obige ist der detaillierte Inhalt vonWie aktualisiere ich eine Benutzeroberfläche sicher aus einem Hintergrundthread in einer anderen Klasse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn