Показывать индикатор выполнения при выполнении какой-либо работы в 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);

который поддерживает индикатор выполнения (означает не замораживать, а обновлять марку)

Ответы на вопрос(13)

Ваш ответ на вопрос