我有一个控制台应用程序,我正在尝试使用.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
应该等到代表完全执行。
答案 0 :(得分:1)
将调试器设置为中断所有异常。你可能会发现一个未处理的异常已经杀死了这个过程。
更好地使用TPL。本来可以防止这个错误。