处理后台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();

如何妥善处理?

处理后台worker中的对话窗口

首先,ShowDialog()将阻止其余的代码执行,直到对话框被关闭——这是你永远不会做的。

即使它关闭了,它也会计算while循环(很可能为false,因此被跳过),然后你的backgroundworker将完成。

如果你所做的只是显示一个对话框,那么我会在主线程上这样做,并在后台工作线程上加载进程。

  1. 启动后台工作器(加载代码)
  2. 显示加载对话框在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();
   }
}