Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengemas kini UI dengan Selamat daripada Benang Latar Belakang dalam Kelas Lain?

Bagaimana untuk Mengemas kini UI dengan Selamat daripada Benang Latar Belakang dalam Kelas Lain?

Susan Sarandon
Lepaskan: 2025-01-05 19:34:40
asal
426 orang telah melayarinya

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

Cara Mengemas kini UI daripada Tugasan Latar Belakang dalam Kelas Lain

Tugas latar belakang boleh melaksanakan operasi yang panjang tanpa membekukan UI. Walau bagaimanapun, mengemas kini UI daripada tugasan ini memerlukan mekanisme silang benang. Artikel ini menerangkan cara untuk mencapai ini menggunakan acara dan perwakilan.

Menggunakan Acara dan Perwakilan

Untuk mengemas kini UI daripada urutan latar belakang, anda boleh menggunakan acara dan perwakilan. Peristiwa dibangkitkan apabila peristiwa tertentu berlaku, membolehkan pelanggan melaksanakan kod pratakrif sebagai tindak balas. Perwakilan mewakili kaedah yang boleh dipanggil dalam urutan yang berasingan.

Pendekatan Berasaskan Peristiwa

Dalam pendekatan ini, urutan latar belakang menimbulkan acara apabila UI perlu dikemas kini. Urutan utama melanggan acara ini dan melaksanakan kod kemas kini UI yang sesuai. Berikut ialah contoh:

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));
        // ...
    }
}
Salin selepas log masuk

Pendekatan Berasaskan Tugas (C# 4.5 dan ke atas)

Pilihan lain ialah menggunakan tugasan, yang mewakili operasi tak segerak. Tugasan boleh dibuat menggunakan kaedah Task.Run, dan ia menyediakan cara yang bersih untuk melaksanakan kod dalam urutan berasingan.

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);
        // ...
    }
}
Salin selepas log masuk

Kesimpulan

Kedua-dua acara- pendekatan berasaskan dan berasaskan tugas boleh digunakan untuk mengemas kini UI daripada urutan latar belakang. Pendekatan berasaskan peristiwa adalah lebih mudah, tetapi pendekatan berasaskan tugas memberikan kawalan dan pengendalian ralat yang lebih baik. Pilih pendekatan yang paling sesuai dengan keperluan khusus anda.

Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini UI dengan Selamat daripada Benang Latar Belakang dalam Kelas Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan