C# WaitHandle.WaitAll没有等吗?
我有一个控制台应用程序,我正在尝试使用.NET3.5执行一些线程工作C# WaitHandle.WaitAll没有等吗?,c#,.net,multithreading,delegates,C#,.net,Multithreading,Delegates,我有一个控制台应用程序,我正在尝试使用.NET3.5执行一些线程工作 int[] iArrReports = { 6/*, 103*/ }; WaitHandle[] handles = new WaitHandle[iArrReports.Length]; for(int i = 0; i < iArrReports.Length; i++) { PerformMergeDelegate mergeDelegate = new PerformM
int[] iArrReports = { 6/*, 103*/ };
WaitHandle[] handles = new WaitHandle[iArrReports.Length];
for(int i = 0; i < iArrReports.Length; i++)
{
PerformMergeDelegate mergeDelegate = new PerformMergeDelegate(doWork);
IAsyncResult result = mergeDelegate.BeginInvoke(iArrReports[i], (r) =>
{
Logger delegateLogger = mergeDelegate.EndInvoke(r);
if (delegateLogger.iMessageLevel == Logger.LOG_LEVELS.LEVEL_ERROR)
{
try
{
Monitor.Enter(logger);
logger.LogFile(delegateLogger.strErrorMessage);
}
finally
{
Monitor.Exit(logger);
}
}
}, null);
handles[i] = result.AsyncWaitHandle;
}
WaitHandle.WaitAll(handles);
int[]iArrReports={6/*,103*/};
WaitHandle[]句柄=新的WaitHandle[iArrReports.Length];
对于(int i=0;i
{
Logger delegateLogger=mergeDelegate.EndInvoke(r);
if(delegateLogger.iMessageLevel==Logger.LOG\u LEVELS.LEVEL\u ERROR)
{
尝试
{
进入(记录器);
logger.LogFile(delegateLogger.strErrorMessage);
}
最后
{
监视器。退出(记录器);
}
}
},空);
句柄[i]=result.AsyncWaitHandle;
}
WaitHandle.WaitAll(句柄);
当我在VS2013中单步执行代码时,在我的doWork
方法中设置了一个断点,该断点被命中,但在命中后不久,WaitAll
似乎返回,应用程序关闭。我注释掉了iarreports
中的第二个条目,只是为了测试
为什么我的申请要截止?我认为
WaitAll
应该等到委托完全执行。设置调试器以在所有异常时中断。您可能会发现一个未处理的异常终止了进程
最好使用第三方物流。本可以防止此错误。此方法确实会等待,是的。将调试器设置为在出现所有异常时中断。更好的方法是使用Tasks或Parallel.ForEach和lock语句。看起来我在委托中遇到了一个我没有处理的异常,我甚至没有想到它会如此简单:)请将此作为答案发布,我会接受它。