Quero mostrar o andamento dos cálculos, que estão sendo executados na biblioteca externa.
Por exemplo, se eu tiver algum método de cálculo e quiser usá-lo para 100.000 valores em minha classe Form, posso escrever:
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();
}
}
}
Devo realizar a etapa após cada cálculo. Mas e se eu executar todos os 100.000 cálculos no método externo. Quando devo "executar a etapa" se não quiser tornar esse método dependente da barra de progresso? Posso, por exemplo, escrever
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);
}
}
mas eu não quero fazer assim.
c#
winforms
progress-bar
Dmytro
fonte
fonte
Respostas:
Eu sugiro que você dê uma olhada em BackgroundWorker . Se você tiver um loop tão grande em seu WinForm, ele será bloqueado e seu aplicativo parecerá ter travado.
Consulte
BackgroundWorker.ReportProgress()
para ver como relatar o progresso de volta para o thread de interface do usuário.Por exemplo:
fonte
BackgroundWorker
é adicionado por meio do designer e configurado lá. Mas sim, ele precisará ser configurado paraWorkerReportsProgress
definir comotrue
.RunWorkerCompleted
manipulador de eventos, se o seuDoWork
manipulador não o fizer ..Desde o .NET 4.5, você pode usar a combinação de assíncrono e esperar com Progresso para enviar atualizações ao thread de interface do usuário:
As tarefas são atualmente a forma preferida de implementar o que
BackgroundWorker
faz.fonte
await DoWorkAsync(progress);
? Isso é muito proposital, pois não resultaria na execução de um thread extra. Somente seDoWorkAsync
chamar seu próprioawait
para, por exemplo, aguardar uma operação de E / S, abutton1_Click
função continuará. O thread principal da IU está bloqueado durante esse período. SeDoWorkAsync
não for realmente assíncrono, mas apenas um monte de instruções síncronas, você não ganha nada.Step
está disponível apenas na barra de progresso do WinForms e não é necessário aqui, mas estava presente no código de exemplo da pergunta (winforms marcados), então pode ser que possa ficar.Olá, há um tutorial útil sobre pérolas Dot Net: http://www.dotnetperls.com/progressbar
De acordo com Peter, você precisa usar alguma quantidade de threading ou o programa simplesmente travará, frustrando de alguma forma o propósito.
Exemplo que usa ProgressBar e BackgroundWorker: C #
fonte
Existe
Task
existe, é unnesscery usandoBackgroundWorker
,Task
é mais simples. por exemplo:ProgressDialog.cs:
Feito! Então você pode reutilizar ProgressDialog em qualquer lugar:
fonte