在线程里显示对话框,
第一次点击按钮的话正常显示在调用画面的前面
第二次以后对话框就跑到画面后面了。而不在线程里操作的话,每次都显示在前面
这是为什么
有什么解决办法么(必须要用线程为前提)贴出代码        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            PrintDialog print = new PrintDialog();
            DialogResult result = print.ShowDialog();
            if (result == DialogResult.OK)
            {
                int i = 0;
            }
        }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Over");
        }        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();        }

解决方案 »

  1.   

      private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
      {
          Action action = () => 
          {
             PrintDialog print = new PrintDialog();
             DialogResult result = print.ShowDialog();
             if (result == DialogResult.OK)
             {
                 int i = 0;
             }
          };
          this.Invoke(action, null);
      }
      

  2.   

    原因是在线程里ShowDialog,和现有的UI不在一个线程里,这样线程里的对话框不会在最前面。解决办法:用Form.Invoke来ShowDialog 让显示的Dialog在UI线程上执行。但注意,Invoke里的代码因为都是UI线程执行,所以会阻塞其他UI操作。
      

  3.   


    MessageBox.Show("Over");
    MessageBox 没有 Owner,所以它不属于任何一个窗体。。当然到处乱跑。
    MessageBox.Show(form, "Over"); // form: 当前窗体。
    大概如此。。手边没有什么编程工具与资料。。参数顺序可能有错。
      

  4.   


    实在是抱歉啊
    我的例子不好啊
    我真正用的地方是class里Invoke这个方法引用不出来啊。
      

  5.   

    那你的ShowDialog的代码应该移到UI层处理。比如:UI层注册 backgroundWorker1_RunWorkerCompleted 事件处理里。
      

  6.   

    DialogResult result = print.ShowDialog()的后面有一堆处理
    如果把showdialog处理放在backgroundWorker1_RunWorkerCompleted里
    一个是线程的意义没了,另外一个重要的是流程会出现问题(只有按dialog画面的OK按钮后才处理后面问题)。
      

  7.   

    那你不能在Dialog之后再起线程处理?
      

  8.   


    其实Dialog前面是查数据的处理,也在线程里处理。
    dialog后面是打印处理
    都需要在线程里处理
      

  9.   

    两个方案:
    1. 查询和打印分开两个部分的线程,查询(Thread1) -> UI Dialog -> 打印(Thread2)
    2. 不推荐:你把Form的引用传到类里去