Saya ingin menunjukkan kemajuan penghitungan, yang dilakukan di perpustakaan eksternal.
Misalnya jika saya memiliki beberapa metode penghitungan, dan saya ingin menggunakannya untuk nilai 100000 di kelas Formulir saya, saya dapat menulis:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Caluculate(int i)
{
double pow = Math.Pow(i, i);
}
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Maximum = 100000;
progressBar1.Step = 1;
for(int j = 0; j < 100000; j++)
{
Caluculate(j);
progressBar1.PerformStep();
}
}
}
Saya harus melakukan langkah setelah setiap perhitungan. Tetapi bagaimana jika saya melakukan semua perhitungan 100000 dalam metode eksternal. Kapan saya harus "melakukan langkah" jika saya tidak ingin metode ini bergantung pada bilah kemajuan? Saya bisa, misalnya, menulis
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void CaluculateAll(System.Windows.Forms.ProgressBar progressBar)
{
progressBar.Maximum = 100000;
progressBar.Step = 1;
for(int j = 0; j < 100000; j++)
{
double pow = Math.Pow(j, j); //Calculation
progressBar.PerformStep();
}
}
private void button1_Click(object sender, EventArgs e)
{
CaluculateAll(progressBar1);
}
}
tetapi saya tidak ingin melakukan seperti itu.
c#
winforms
progress-bar
Dmytro
sumber
sumber
Jawaban:
Saya menyarankan Anda untuk melihat BackgroundWorker . Jika Anda memiliki loop sebesar itu di WinForm Anda, itu akan memblokir dan aplikasi Anda akan terlihat seperti hang.
Lihat
BackgroundWorker.ReportProgress()
untuk melihat bagaimana melaporkan kemajuan kembali ke UI thread.Sebagai contoh:
sumber
BackgroundWorker
ditambahkan melalui desainer dan dikonfigurasi di sana. Tapi ya, itu perlu dikonfigurasi untukWorkerReportsProgress
disetel ketrue
.RunWorkerCompleted
event handler, jikaDoWork
handler Anda tidak melakukannya ..Sejak .NET 4.5 Anda dapat menggunakan kombinasi asinkron dan menunggu dengan Kemajuan untuk mengirim pembaruan ke utas UI:
Tugas saat ini merupakan cara yang disukai untuk menerapkan apa yang
BackgroundWorker
dilakukannya.sumber
await DoWorkAsync(progress);
? Ini sangat disengaja, karena itu tidak akan menghasilkan thread tambahan yang berjalan. Hanya jikaDoWorkAsync
akan memanggilnya sendiriawait
misalnya menunggu pada operasi I / O, apakahbutton1_Click
fungsi akan dilanjutkan. Rangkaian UI utama diblokir selama durasi ini. JikaDoWorkAsync
tidak benar-benar asinkron tetapi hanya banyak pernyataan sinkron, Anda tidak mendapatkan apa pun.Step
hanya tersedia di bilah kemajuan WinForms dan tidak diperlukan di sini, tetapi itu ada dalam kode contoh pertanyaan (diberi tag winforms), jadi mungkin itu bisa tetap.Halo, ada tutorial berguna tentang mutiara Dot Net: http://www.dotnetperls.com/progressbar
Dalam kesepakatan dengan Peter, Anda perlu menggunakan sejumlah threading atau program akan hang, agak menggagalkan tujuannya.
Contoh yang menggunakan ProgressBar dan BackgroundWorker: C #
sumber
Ada yang
Task
ada, Ini adalah penggunaan unnessceryBackgroundWorker
,Task
lebih sederhana. sebagai contoh:ProgressDialog.cs:
Selesai! Kemudian Anda dapat menggunakan kembali ProgressDialog di mana saja:
sumber