Я пытался выяснить проблему с фоновой загрузкой, которую я делаю при запуске. Приложение работает отлично, но когда оно закрыто, оно вечно вечно. Я предположил, что это проблема с потоками. Я сузил его до следующего кода. Я гулял по всему миру, но не сталкивался с чем-либо, что соответствует той проблеме, которую я испытываю, может ли кто-нибудь подробно рассказать о безопасности потоков?C# WPF Background Loading Thread, Hang on Exit
Я предположил, что, учитывая, что экран загрузки закрыт, когда рабочий завершен (m_LoaderWindow.Close();), что это не будет проблематичным.
Этот код не работает
m_LoaderWindow = new LoadingWindow();
m_BackgroundWorker = new BackgroundWorker();
OnProgressDelegate = m_BackgroundWorker.ReportProgress;
m_BackgroundWorker.WorkerReportsProgress = true;
m_BackgroundWorker.ProgressChanged += (object sender, ProgressChangedEventArgs arg) =>
{
LoaderWindow.Context.Progress = arg.ProgressPercentage;
};
m_BackgroundWorker.DoWork += MBackgroundWorkerOnDoWork;
m_BackgroundWorker.RunWorkerCompleted += MBackgroundWorkerOnRunWorkerCompleted;
m_BackgroundWorker.RunWorkerAsync();
m_LoaderWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
m_LoaderWindow.Owner = Application.Current.MainWindow;
m_LoaderWindow.ShowDialog();
Этот код работает (но, очевидно, не экран загрузки)
m_BackgroundWorker = new BackgroundWorker();
OnProgressDelegate = m_BackgroundWorker.ReportProgress;
m_BackgroundWorker.WorkerReportsProgress = true;
m_BackgroundWorker.ProgressChanged += (object sender, ProgressChangedEventArgs arg) =>
{
LoaderWindow.Context.Progress = arg.ProgressPercentage;
};
m_BackgroundWorker.DoWork += MBackgroundWorkerOnDoWork;
m_BackgroundWorker.RunWorkerCompleted += MBackgroundWorkerOnRunWorkerCompleted;
m_BackgroundWorker.RunWorkerAsync();
Вот рабочий завершил код
private void MBackgroundWorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
m_LoaderWindow.Close();
}));
}
FYI, событие RunWorkerCompleted будет срабатывать по потоку пользовательского интерфейса. Поэтому вам не нужно использовать Dispatcher.Invoke, чтобы закрыть окно вашего загрузчика. – RogerN
Спасибо, ты прав. К сожалению, до сих пор не решена проблема :( – Asheh