c# - 提问 BackgroundWorker 并打开新页面
问题描述
我使用 BackgroundWorker 来制作一些事件,如下所示:
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerAsync();
在 DoWork 内部,我有:
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
int totalExecucao = 2;
int count = 0;
setMensagemText(count++, "Verificando Banco de dados...", totalExecucao);
VerificaDataBase();
setMensagemText(count++, "Verificando Configurações Locais", totalExecucao);
verificaConfiguracaoLocal();
worker.ReportProgress(100);
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
MainWindow mw = new MainWindow();
mw.Show();
this.Close();
}));
我必须检查“configurações locais”,如果没有注册,我必须打开一个页面,用户需要进行一些配置并保存,然后,结束打开 MainView 表单,以检查我是否使用此代码:
private void verificaConfiguracaoLocal()
{
LocalBean localBean = new LocalBean();
localBean.CarregaModel();
if (localBean.Model.Id > -1)
//if(localBean.Model.Id == 0)
{
Thread novaNotificacao = new Thread(new ThreadStart(Notify));
novaNotificacao.SetApartmentState(ApartmentState.STA);
novaNotificacao.Start();
worker.CancelAsync();
void Notify()
{
LocalPage lp = new LocalPage();
Window win2 = new Window();
win2.Content = lp;
win2.Show();
}
}
}
Whats Happen In process 页面是自动打开和关闭的,按顺序他将进行下一步检查,本例打开 MainWindow。
我必须:打开表单时,我需要 BackgroundWorker 等待用户关闭 Win2,然后继续检查
编辑 =================================================== ========================
我试过了:
private AutoResetEvent _workerCompleted = new AutoResetEvent(false);
setMensagemText(count++, "Verificando Banco de dados...", totalExecucao);
VerificaDataBase();
_workerCompleted.WaitOne();
setMensagemText(count++, "Verificando Configurações Locais", totalExecucao);
verificaConfiguracaoLocal();
_workerCompleted.WaitOne();
private void verificaConfiguracaoLocal()
{
LocalBean localBean = new LocalBean();
localBean.CarregaModel();
verificaAbrirPage(localBean.Model.Id, typeof(LocalPage));
if (LocalBean.ModelStatic.Id.Equals(0))
{
NotificacaoUtil.Error("Para o sistema carregar corretamente, é necessário ter uma configuração local. O sistema será finalizado!");
Environment.Exit(0);
}
}
private void verificaAbrirPage(long id, Type page)
{
if (id.Equals(0))
{
Dispatcher.BeginInvoke(new Action(() =>
{
Page lp = (Page)Activator.CreateInstance(page);
Window win2 = new Window();
win2.Content = lp;
win2.Closed += (s, a) =>
{
_workerCompleted.Set();
};
win2.Show();
}));
}
else
{
_workerCompleted.Set();
}
}
但继续不工作
解决方案
推荐阅读
- html - 波纹效果纯css透明
- kubernetes - 无法在新创建的 GKE 集群上初始化 helm(tiller)
- r - 如何创建一个存储 data.frames 的对象,并允许使用 '.' 检索它们?
- selenium - 并行执行多次单硒测试
- python - 尝试通过 Python 使用 PostgreSQL 数据更新 google sheet 时出错
- jsf - 在 Menu 中设置值并在 Dialog 中显示
- c# - 用于 DB 调用的带有 Task.Run 方法的异步等待
- kubernetes - 使 Traefik 将 HTTP BAN 请求路由到与常规 HTTP 请求不同的服务或端口
- java - 如何在不访问更大类型的情况下缩放 Int64 值?
- javascript - JavaScript。在 setTimeout 函数中分配不正确的值