Form.Show()间歇地在线程中显示表单

sil*_*oon 1 c# multithreading

我需要在打开文件时显示进度对话框,这是一项耗时的操作.为此,我在我的打开文件函数中使用以下内容:

           //some code
           ...
           ...
           ...
           bool done = false;

            //Show progress in a separate thread. 
            System.Threading.ThreadPool.QueueUserWorkItem((x) =>
            {
                using (var progressDialog = new ProgressDialog())
                {
                    progressDialog.TopMost = true;
                    progressDialog.Show();

                    while (!done)
                    {
                        if(progressDialog.Message != this.strProgressMsg)
                            progressDialog.Message = this.strProgressMsg;

                        Application.DoEvents();
                    }

                    progressDialog.Close();
                }
            });

           ....
           ....
           done = true;
           ....
           ....
Run Code Online (Sandbox Code Playgroud)

问题: 进度条对话框显示一些时间,有时则不显示.我的文件打开功能在主线程中运行.有人可以指出我正确的检测为什么会发生这种情况?

cdh*_*wie 5

你有这个倒退.这是它应该如何工作:

  1. 关闭一个线程以打开该文件,然后使用它来回调主线程progressDialog.Invoke()以执行GUI更新.(它不应该设置strProgressMsg并等待其他东西注意到更改 - 让它直接将更新发送到对话框.)
  2. 从主线程模态显示进度对话框.

所以像这样:

using (var progressDialog = new ProgressDialog()) {
    progressDialog.TopMost = true;

    System.Threading.ThreadPool.QueueUserWorkItem((x) =>
    {
        try {
            // this represents whatever loop you use to load the file
            while (...) {
                // do some work loading the file

                // update the status
                progressDialog.Invoke(new MethodInvoker(
                    () => progressDialog.Message = "Hello, World!"));
            }
        } finally {
            // done working
            progressDialog.Invoke(new MethodInvoker(progressDialog.Close));
        }
    });

    // this will block until the thread closes the dialog
    progressDialog.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud)