请高手指点在线等。按钮代码如下: 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不能同时用?
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不能同时用?
=>
doneEvents.ForEach(x => x.WaitOne());
{
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());
}