【发布时间】:2014-07-17 12:07:53
【问题描述】:
我有一个控制台应用程序,我正在尝试使用 .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 应该等到委托完全执行。
【问题讨论】:
-
这个方法确实在等待,是的。将调试器设置为中断所有异常。更好的是,使用 Tasks 或 Parallel.ForEach 和 lock 语句。
-
看起来我在我的代表中遇到了一个我没有处理的异常,我什至没想到会这么简单:) 请将此作为答案发布,我会接受.
标签: c# .net multithreading delegates