C# 在backgroundworker中处理dialogwindow

C# 在backgroundworker中处理dialogwindow,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,我正在backgroundworker中加载屏幕: private void LSLoadingScreen(object sender, DoWorkEventArgs e) { LoadingScreen ls = new LoadingScreen(this.timerStart); ls.ShowDialog(); while (LoadingScreen.CancellationPending) {

我正在backgroundworker中加载屏幕:

 private void LSLoadingScreen(object sender, DoWorkEventArgs e)
    {
        LoadingScreen ls = new LoadingScreen(this.timerStart);
        ls.ShowDialog();

        while (LoadingScreen.CancellationPending)
        {
            ls.Dispose();
            LoadingScreen.Dispose();
        }
但当我在其他功能中使用此代码时,我的加载屏幕不会处理:

LoadingScreen.CancelAsync();
timerStart = false;
LoadingScreen.Dispose();
如何正确地处理它?

首先,ShowDialog()将阻止其余代码在对话框关闭之前执行,而您永远不会这样做

即使它确实关闭了,它也会计算while循环(很可能是false,因此跳过),然后您的backgroundworker就完成了

如果您所做的只是显示一个对话框,那么我将在主线程上执行此操作,并在后台工作程序上执行加载过程

  • Fire后台工作人员(不加载代码)
  • 显示加载对话框
  • 在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();
       }
    }
    

    如何使加载屏幕ls在BackgroundWorker函数中可见?申报单放在哪里?LoadingScreen ls=新的LoadingScreen(this.timerStart);当我把它放在“public partial class MainForm:Form{”后面时,我得到一个错误,即“关键字‘this’在当前上下文中不可用”,当我把它放在public MainForm()后面时,{,加载屏幕在函数中不可用。很抱歉这个愚蠢的问题。不要让它在Bgw中可见,在启动Bgw之前显示它。