Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WaitHandle.WaitAll没有等吗?_C#_.net_Multithreading_Delegates - Fatal编程技术网

C# WaitHandle.WaitAll没有等吗?

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

我有一个控制台应用程序,我正在尝试使用.NET3.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);
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语句。看起来我在委托中遇到了一个我没有处理的异常,我甚至没有想到它会如此简单:)请将此作为答案发布,我会接受它。