请高手指点在线等。按钮代码如下:        List<ManualResetEvent> doneEvents;
        ManualResetEvent doneEvent;
        private void btnMutlieAdd_Click(object sender, EventArgs e)
        {
            DialogResult dr = openFileDialog1.ShowDialog();
            if (dr == DialogResult.OK)
            {
                ///此处省略代码
                for()///此处省略代码
                {
                    doneEvent = new ManualResetEvent(false);
                    doneEvents.Add( doneEvent);
                    ThreadPool.QueueUserWorkItem(ThreadPoolCallback1, qqInfo);
                }                //等待所有结束
                WaitHandle.WaitAll(doneEvents.ToArray());
            }
        }        ////[STAThread]
        [MTAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
如果用MTAThread的话, DialogResult dr = openFileDialog1.ShowDialog(); 这里就
   异常:
    在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。改成[STAThread]的话,WaitHandle.WaitAll(doneEvents.ToArray());就
异常:
     不支持一个 STA 线程上针对多个句柄的 WaitAll。是不是openFileDialog和WaitAll不能同时用?

解决方案 »

  1.   

    WaitHandle.WaitAll(doneEvents.ToArray());
    =>
    doneEvents.ForEach(x => x.WaitOne());
      

  2.   

    private void btnMutlieAdd_Click(object sender, EventArgs e)
    {
           DialogResult dr = openFileDialog1.ShowDialog(); 
           if (dr == DialogResult.OK)
           {
               ThreadPool.QueueUserWorkItem(DoWork, qqInfo);
           }
     }       void DoWork(object state)
           {
            ///此处省略代码
                    for()///此处省略代码
                    {
                        doneEvent = new ManualResetEvent(false);
                        doneEvents.Add(doneEvent);
                        ThreadPool.QueueUserWorkItem(ThreadPoolCallback1, state);
                    }                //等待所有结束
                    WaitHandle.WaitAll(doneEvents.ToArray());
             }