WPF BackgroundWorker while main window loading
WPF BackgroundWorker while main window loading
我有主要的 WPF 应用程序 window。我希望 BackgroundWorker 在 main window 加载时打开加载 window (WinLoading),并在加载完成时关闭它。我在主 window 中有这段代码。当我运行它时,我会在操作完成后打开 WinLoading window,然后再打开主 window(10 秒后)。
public MainWindow()
{
InitializeComponent();
wLoadingService = new BackgroundWorker();
wLoadingService.DoWork += wLoadingService_DoWork;
wLoadingService.RunWorkerCompleted += wLoadingService_RunWorkerCompleted;
wLoadingService.WorkerReportsProgress = true;
wLoadingService.WorkerSupportsCancellation = true;
wLoadingService.RunWorkerAsync();
//some action (takes 10 seconds).....
}
void wLoadingService_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
WinLoading.EndDisplay();
}));
}
void wLoadingService_DoWork(object sender, DoWorkEventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
WinLoading.Loading("Connecting...");
WinLoading.BeginDisplay();
}));
}
您明确地 运行 使用 this.Dispatcher.Invoke
在主 UI 线程上工作。这有效地使您的后台工作人员无用,迫使它等待主线程完成 "some action".
"Some action"就是这里的长运行ning任务。 那 是您要从后台工作程序执行的代码,而您的主线程处理 WinLoading 对话框。
我有主要的 WPF 应用程序 window。我希望 BackgroundWorker 在 main window 加载时打开加载 window (WinLoading),并在加载完成时关闭它。我在主 window 中有这段代码。当我运行它时,我会在操作完成后打开 WinLoading window,然后再打开主 window(10 秒后)。
public MainWindow()
{
InitializeComponent();
wLoadingService = new BackgroundWorker();
wLoadingService.DoWork += wLoadingService_DoWork;
wLoadingService.RunWorkerCompleted += wLoadingService_RunWorkerCompleted;
wLoadingService.WorkerReportsProgress = true;
wLoadingService.WorkerSupportsCancellation = true;
wLoadingService.RunWorkerAsync();
//some action (takes 10 seconds).....
}
void wLoadingService_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
WinLoading.EndDisplay();
}));
}
void wLoadingService_DoWork(object sender, DoWorkEventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
WinLoading.Loading("Connecting...");
WinLoading.BeginDisplay();
}));
}
您明确地 运行 使用 this.Dispatcher.Invoke
在主 UI 线程上工作。这有效地使您的后台工作人员无用,迫使它等待主线程完成 "some action".
"Some action"就是这里的长运行ning任务。 那 是您要从后台工作程序执行的代码,而您的主线程处理 WinLoading 对话框。