Я хочу отображать индикатор выполнения, выполняя некоторую работу, но при этом пользовательский интерфейс зависает, а индикатор выполнения не обновляется.
У меня есть WinForm ProgressForm с ProgressBar
, который будет продолжаться бесконечно шатер .
using(ProgressForm p = new ProgressForm(this))
{
//Do Some Work
}
Теперь есть много способов решить проблему, например, используя BeginInvoke
, дождитесь завершения задачи и наберите EndInvoke
. Или используя BackgroundWorker
или Threads
.
У меня есть некоторые проблемы с EndInvoke, хотя это не вопрос. Вопрос в том, какой самый лучший и самый простой способ, которым вы пользуетесь в таких ситуациях, когда вы должны показать пользователю, что программа работает и не отвечает, и как вы справляетесь с этим с помощью максимально простого кода, который эффективен и выиграл ». t утечка, и может обновить графический интерфейс.
Как и 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);
, который поддерживает индикатор выполнения (означает не замораживание, а обновление маркера)