我有一个控制台应用程序,我正在尝试使用.NET 3.5做一些线程处理工作。
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);当我步进VS2013中的代码时,在我的doWork方法中设置了一个被击中的断点,但在被击中后不久,WaitAll似乎返回了,应用程序也关闭了。我只为测试而注释掉了iArrReports中的第二个条目。
为什么我的申请要关闭?我认为WaitAll应该等到委托完全执行。
发布于 2014-07-17 12:19:12
将调试器设置为中断所有异常。您可能会发现,一个未处理的异常已经扼杀了该进程。
最好用TPL。就能避免这个错误。
https://stackoverflow.com/questions/24803135
复制相似问题