在backgroundworker中处理dialogwindow

时间:2011-10-13 07:34:28

标签: c# winforms backgroundworker

我正在后台工作中加载屏幕:

 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();

如何妥善处理?

1 个答案:

答案 0 :(得分:3)

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

即使它关闭了,它也会评估while循环(很可能是假的,所以跳过),然后你的后台工作就会完成。

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

  1. 消防后台工作人员(负责代码)
  2. 显示您的加载对话框
  3. 在BackgroundWorkerCompleted事件上,关闭加载对话框
  4. 尝试在主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();
       }
    }