为什么我在一个线程里使用openFileDialog对话框时,在我的电脑里不能看见盘符
 
而直接在主线程使用openFileDialog就没问题?应该怎么解决?? 代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public void ShowOpenDialog()
        {
            OpenFileDialog op = new OpenFileDialog();
            op.ShowDialog();
         
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(ShowOpenDialog));
            t.Start();        }
    }
}

解决方案 »

  1.   

    不要在非ui线程里面使用ui相关的东西,否则 会有莫名其妙的问题
      

  2.   

    回复人:akirya(坏[其实偶不是什么所谓的坏人]) ( 一级(初级)) 信誉:100  2006-12-15 13:20:48  得分:0不要在非ui线程里面使用ui相关的东西,否则 会有莫名其妙的问题正解啊,用Invoke实现吧。
      

  3.   

    其实直接在线程里调用窗口是不合适的,在2005里会报错,在03下不报错,可是不会正常的远行,要能正常的在线程里调用窗口成员可以像如下用delegate来实现:delegate void showdlalog();
    public void ShowOpenDialog()
    {
    if (this.InvokeRequired)
    {
    showdlalog sdg = new showdlalog(this.ShowOpenDialog);
    this.Invoke(sdg);
    return;
    }
    OpenFileDialog op = new OpenFileDialog();
    op.ShowDialog();
    }
      

  4.   

    还有一点,就是在显示一个模式窗口时最好加上那个可以省去的参数Owner,像如下调用:OpenFileDialog op = new OpenFileDialog();
    op.ShowDialog(this);如果做的多了,就知道是什么了.
      

  5.   

    线程里不要进行界面操作,界面操作请委托窗体的Invoke方法执行。
      

  6.   

    防止线程同步。必须使用delegate 然后再在主窗体里面 Invoke就OK了。vs2005才会出现线程安全的情况,vs2003里面不会。
      

  7.   

    本人从事C#开发已有三年时间,希望结交行内好友,大家共同进取,
    请加我的QQ群号码:35651007 注明CSDN即可