【问题标题】:WaitHandle.WaitAll not waiting?WaitHandle.WaitAll 不等待?
【发布时间】: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


【解决方案1】:

将调试器设置为中断所有异常。你可能会发现一个未处理的异常杀死了进程。

更好地使用 TPL。本来可以避免这个错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2018-05-04
    • 2020-05-09
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多