Я хочу отобразить индикатор выполнения при выполнении какой-либо работы, но это приведет к зависанию пользовательского интерфейса, и индикатор выполнения не будет обновляться.
У меня есть 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);
который удерживает индикатор выполнения в живых (означает, что он не замерзает, а освежает марку)