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?

Jan 05, 2025 pm 07:34 PM

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));
        // ...
    }
}
Nach dem Login kopieren

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);
        // ...
    }
}
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert? Mar 03, 2025 pm 05:52 PM

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

GULC: C -Bibliothek von Grund auf neu gebaut GULC: C -Bibliothek von Grund auf neu gebaut Mar 03, 2025 pm 05:46 PM

GULC: C -Bibliothek von Grund auf neu gebaut

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte Mar 03, 2025 pm 05:53 PM

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die? Mar 03, 2025 pm 05:53 PM

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

eindeutiger Gebrauch und Phrasenfreigabe eindeutiger Gebrauch und Phrasenfreigabe Mar 03, 2025 pm 05:51 PM

eindeutiger Gebrauch und Phrasenfreigabe

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Wo ist der Rückgabewert der C -Sprachfunktion im Speicher? Mar 03, 2025 pm 05:51 PM

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)? Mar 12, 2025 pm 04:50 PM

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient? Mar 12, 2025 pm 04:52 PM

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?

See all articles