处理后台worker中的对话窗口
本文关键字:对话 窗口 后台 worker 处理 | 更新日期: 2023-09-27 18:11:02
我正在后台加载屏幕:
private void LSLoadingScreen(object sender, DoWorkEventArgs e)
{
LoadingScreen ls = new LoadingScreen(this.timerStart);
ls.ShowDialog();
while (LoadingScreen.CancellationPending)
{
ls.Dispose();
LoadingScreen.Dispose();
}
但是当我在其他函数中使用此代码时,我的loadingScreen不处理:
LoadingScreen.CancelAsync();
timerStart = false;
LoadingScreen.Dispose();
如何妥善处理?
首先,ShowDialog()将阻止其余的代码执行,直到对话框被关闭——这是你永远不会做的。
即使它关闭了,它也会计算while循环(很可能为false,因此被跳过),然后你的backgroundworker将完成。
如果你所做的只是显示一个对话框,那么我会在主线程上这样做,并在后台工作线程上加载进程。
- 启动后台工作器(加载代码) 显示加载对话框在BackgroundWorkerCompleted事件中,关闭加载对话框
尝试将所有UI元素放在主UI线程中。
希望有帮助
编辑:根据你的评论…
public partial class MainForm:Form
{
LoadingScreen ls;
public MainForm()
{
}
public void StartLoad()
{
ls = new LoadingScreen(this.timerStart);
backgroundWorker.RunWorkerAsync();
ls.Show();
}
void backgroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
//Loading code goes here
}
void BackgroundWorkerMainRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(ls != null)
ls.Close();
}
}