Dalam aplikasi saya, saya perlu melakukan serangkaian langkah inisialisasi, ini membutuhkan 7-8 detik untuk menyelesaikan di mana UI saya menjadi tidak responsif. Untuk mengatasi ini saya melakukan inisialisasi di utas terpisah:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
Saya telah membaca beberapa artikel tentang BackgroundWorker
dan bagaimana seharusnya memungkinkan saya untuk menjaga aplikasi saya responsif tanpa harus menulis utas untuk melakukan tugas yang panjang tapi saya belum berhasil menerapkannya, adakah yang bisa mengatakan bagaimana saya akan melakukan ini menggunakan BackgroundWorker
?
c#
wpf
multithreading
backgroundworker
Eamonn McEvoy
sumber
sumber
Jawaban:
Lacak kemajuan (opsional, tetapi sering bermanfaat)
a) berlangganan
ProgressChanged
acara dan gunakanReportProgress(Int32)
diDoWork
b) set
worker.WorkerReportsProgress = true;
(kredit ke @zagy)sumber
Anda mungkin ingin juga melihat menggunakan
Task
alih-alih pekerja latar belakang.Cara termudah untuk melakukan ini adalah dalam contoh Anda adalah
Task.Run(InitializationThread);
.Ada beberapa manfaat menggunakan tugas alih-alih pekerja latar belakang. Misalnya, fitur async / await baru dalam .net 4.5 digunakan
Task
untuk threading. Berikut ini beberapa dokumentasi tentangTask
https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.tasksumber
BackgroundWorker
. Berharap untuk mengarahkan orang ke sana.async
danawait
. Ini adalah cara terintegrasi bahasa untuk menggunakan tugas dengan cara yang jauh lebih mudah dibaca.Juga, rujuk tautan di bawah ini Anda akan memahami konsep
Background
:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
sumber
Saya menemukan ini ( WPF Multithreading: Menggunakan BackgroundWorker dan Melaporkan Kemajuan ke link UI. ) Mengandung sisa detail yang hilang dari jawaban @ Andrew.
Satu hal yang saya temukan sangat berguna adalah bahwa thread pekerja tidak dapat mengakses kontrol MainWindow (dalam metode itu sendiri), namun ketika menggunakan delegasi di dalam pengendali event windows utama itu mungkin.
sumber