В моем приложении мне нужно выполнить серию шагов инициализации, для завершения которых требуется 7-8 секунд, в течение которых мой пользовательский интерфейс перестает отвечать на запросы. Чтобы решить эту проблему, я выполняю инициализацию в отдельном потоке:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
Я прочитал несколько статей о том, BackgroundWorker
как и как это должно позволить мне поддерживать отзывчивость моего приложения без необходимости писать поток для выполнения длинных задач, но у меня не было никаких попыток реализовать его, кто-нибудь может сказать, как я это сделаю это используя BackgroundWorker
?
c#
wpf
multithreading
backgroundworker
Имонн МакЭвой
источник
источник
Ответы:
Отслеживать прогресс (необязательно, но часто полезно)
а) подписаться на
ProgressChanged
событие и использоватьReportProgress(Int32)
вDoWork
б) установить
worker.WorkerReportsProgress = true;
(кредиты @zagy)источник
Вы можете также захотеть использовать
Task
вместо фоновых работников.Самый простой способ сделать это в вашем примере
Task.Run(InitializationThread);
.Есть несколько преимуществ использования задач вместо фоновых работников. Например, новые функции async / await в .net 4.5 используют
Task
для многопоточности. Вот некоторая документация оTask
https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskисточник
BackgroundWorker
. Надеюсь направить людей на это.async
иawait
. Это интегрированные в язык способы использования задач в гораздо более удобочитаемом виде.Также, перейдя по ссылке ниже, вы поймете понятия
Background
:http://www.c-sharpcorner.com/UploadFile/1c8574/threads-in-wpf/
источник
Я обнаружил, что ( многопоточность WPF: использование BackgroundWorker и ссылка на отчет о ходе выполнения в пользовательском интерфейсе ) содержит остальные детали, отсутствующие в ответе @ Andrew.
Одна вещь, которую я нашел очень полезной, состояла в том, что рабочий поток не мог получить доступ к элементам управления MainWindow (в своем собственном методе), однако при использовании делегата внутри обработчика событий главного окна это было возможно.
источник