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)); // ... } }
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); // ... } }
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!