Показывать индикатор выполнения при выполнении какой-либо работы в C #?
Я хочу отображать индикатор выполнения, выполняя некоторую работу, но это может привести к зависанию пользовательского интерфейса, и индикатор выполнения не будет обновляться.
У меня есть WinForm ProgressForm сProgressBar
это будет продолжаться до бесконечности вшатер мода.
using(ProgressForm p = new ProgressForm(this))
{
//Do Some Work
}
Теперь есть много способов решить проблему, например, с помощьюBeginInvoke
, дождитесь завершения задания и позвонитеEndInvoke
, Или используяBackgroundWorker
или жеThreads
.
У меня есть некоторые проблемы с EndInvoke, хотя это не вопрос. Вопрос в том, какой самый лучший и самый простой способ, которым вы пользуетесь в таких ситуациях, когда вы должны показать пользователю, что программа работает и не отвечает, и как вы справляетесь с этим с помощью максимально простого кода, который эффективен и выиграл ». т утечка, и может обновить графический интерфейс.
подобноBackgroundWorker
необходимо иметь несколько функций, объявлять переменные-члены и т. д. Кроме того, вам необходимо сохранить ссылку на форму ProgressBar и избавиться от нее.
редактировать: BackgroundWorker
это не ответ, потому что может случиться так, что я не получу уведомление о прогрессе, что означает, что не будет звонкаProgressChanged
какDoWork
это один вызов внешней функции, но мне нужно продолжать вызыватьApplication.DoEvents();
чтобы индикатор выполнения продолжал вращаться.
Награда за лучшее решение кода для этой проблемы. Мне просто нужно позвонитьApplication.DoEvents()
так что индикатор выполнения Marque будет работать, пока рабочая функция работает в главном потоке, и она не возвращает никакого уведомления о ходе выполнения. Мне никогда не требовался магический код .NET для автоматического отчета о прогрессе, мне просто нужно лучшее решение, чем:
Action<String, String> exec = DoSomethingLongAndNotReturnAnyNotification;
IAsyncResult result = exec.BeginInvoke(path, parameters, null, null);
while (!result.IsCompleted)
{
Application.DoEvents();
}
exec.EndInvoke(result);
который поддерживает индикатор выполнения (означает не замораживать, а обновлять марку)