Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengemas kini UI WPF daripada Benang Berasingan dalam Kelas Berbeza?

Bagaimana untuk Mengemas kini UI WPF daripada Benang Berasingan dalam Kelas Berbeza?

DDD
DDDasal
2025-01-05 18:57:43377semak imbas

How to Update a WPF UI from a Separate Thread in a Different Class?

Mengemas kini UI daripada Benang Berasingan dalam Kelas Berbeza

S: Bagaimana untuk mengemas kini UI WPF daripada benang pekerja yang dijalankan dalam kelas berasingan?

J: Untuk mengemas kini UI daripada yang lain benang:

  1. Gunakan Dispatcher.Invoke: Panggil kaedah ini dalam kelas pekerja untuk mengemas kini elemen UI pada urutan utama.
  2. Komunikasi Berasaskan Acara:

    • Buat acara dalam kelas pekerja untuk meningkatkan pemberitahuan kemas kini UI.
    • Daftar pengendali untuk acara ini dalam kelas tetingkap utama.
    • Hantar kemas kini UI dalam pengendali acara.

Contoh Penggunaan Acara:

// Main window class
private void startCalc(object sender, RoutedEventArgs e)
{
    // Create a new worker class instance
    CalcClass calc = new CalcClass();
    
    // Register event handler to receive UI update notifications
    calc.ProgressUpdate += (s, e) =>
    {
        Dispatcher.Invoke((Action)(() => { /* Update UI here */ }));
    };
    
    // Start the worker thread
    Thread calcThread = new Thread(new ParameterizedThreadStart(calc.TestMethod));
    calcThread.Start(input);
}

// Worker class
public class CalcClass
{
    public event EventHandler ProgressUpdate;

    public void TestMethod(object input)
    {
        // Perform calculations
        
        // Raise event to notify UI update
        if (ProgressUpdate != null)
            ProgressUpdate(this, new EventArgs());
    }
}

Nota Tambahan:

Penyelesaian Alternatif Menggunakan Tugas:
Dalam .NET 4.5 dan lebih baru, anda juga boleh menggunakan pengaturcaraan tak segerak dengan Tugas untuk mengemas kini UI dengan lebih bersih dan cekap cara.

Kod Kemas Kini Menggunakan Tugas:

// Main window class
private async void buttonDoCalc_Clicked(object sender, EventArgs e)
{
    // Create a new worker class instance
    CalcClass calc = new CalcClass();
    
    // Start the asynchronous calculation
    await calc.CalcAsync();
}

// Worker class
public class CalcClass
{
    public async Task CalcAsync()
    {
        // Perform calculations
        
        // Update UI using Dispatcher.Invoke
        Dispatcher.Invoke((Action)(() => { /* Update UI here */ }));
    }
}

Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini UI WPF daripada Benang Berasingan dalam Kelas Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn