您的位置:首页 > 大数据 > 人工智能

WaitAll for multiple handles on a STA thread is not supported 解决方案

2011-11-14 09:59 465 查看
封装一个MTA的WaitALL

class MtaWaitAllWrapper {
readonly WaitHandle[] waitHandles;
readonly int millisecondsTimeout;
bool waitResult;
Exception error;

MtaWaitAllWrapper(int millisecondsTimeout,
params WaitHandle[] waitHandles) {

if (waitHandles == null) throw new ArgumentNullException(@"waitHandles");
this.waitHandles = waitHandles;
this.millisecondsTimeout = millisecondsTimeout;

}

void WaitAll() {
if ((waitHandles.Length > 1) && (Thread.CurrentThread.GetApartmentState() != ApartmentState.MTA)) {

Thread thread = new Thread(new ThreadStart(OnWaitAll));
thread.SetApartmentState(ApartmentState.MTA);
thread.Start();
thread.Join();
} else {
OnWaitAll();
}
}

void OnWaitAll() {
try {
waitResult = WaitHandle.WaitAll(waitHandles, millisecondsTimeout, false);
} catch (Exception ex) {
error = ex;
}
}

public static bool WaitAll(int millisecondsTimeout,
params WaitHandle[] waitHandles) {

MtaWaitAllWrapper waitAllWrapper =
new MtaWaitAllWrapper(millisecondsTimeout, waitHandles);

waitAllWrapper.WaitAll();

if (waitAllWrapper.error != null) throw waitAllWrapper.error;

return waitAllWrapper.waitResult;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐