Exibir barra de progresso ao fazer algum trabalho em c #?
Eu quero exibir uma barra de progresso ao fazer algum trabalho, mas que iria travar a interface do usuário e a barra de progresso não será atualizada.
Eu tenho um WinForm ProgressForm com umProgressBar
que continuará indefinidamente em ummarquise moda.
using(ProgressForm p = new ProgressForm(this))
{
//Do Some Work
}
Agora há muitas maneiras de resolver o problema, como usarBeginInvoke
, aguarde a conclusão da tarefa e chameEndInvoke
. Ou usando oBackgroundWorker
ouThreads
.
Estou tendo alguns problemas com o EndInvoke, embora essa não seja a questão. A questão é qual é a melhor e mais simples maneira de lidar com tais situações, onde você tem que mostrar ao usuário que o programa está funcionando e não está respondendo, e como você lida com isso com o código mais simples possível, que é eficiente e venceu. t vazamento e pode atualizar a GUI.
GostarBackgroundWorker
precisa ter múltiplas funções, declarar variáveis de membro, etc. Além disso, você precisa manter uma referência ao Formulário ProgressBar e descartá-lo.
Editar: BackgroundWorker
não é a resposta porque pode ser que eu não receba a notificação de progresso, o que significa que não haveriaProgressChanged
Enquanto oDoWork
é uma única chamada para uma função externa, mas eu preciso continuar a ligar para oApplication.DoEvents();
para a barra de progresso continuar girando.
A recompensa é a melhor solução de código para este problema. Eu só preciso ligarApplication.DoEvents()
para que a barra de progresso Marque funcione, enquanto a função worker funciona no thread Principal e não retorna nenhuma notificação de progresso. Eu nunca precisei de código mágico .NET para reportar o progresso automaticamente, eu só precisava de uma solução melhor que:
Action<String, String> exec = DoSomethingLongAndNotReturnAnyNotification;
IAsyncResult result = exec.BeginInvoke(path, parameters, null, null);
while (!result.IsCompleted)
{
Application.DoEvents();
}
exec.EndInvoke(result);
que mantém a barra de progresso viva (significa não congelar, mas refresca a marca)