Threadpool WaitAll 64 [Leadtools]

时间:2014-10-16 12:01:54

标签: multithreading c#-4.0 threadpool

我知道WaitAll ManualResetEvents有限制,即64.(任何理由为64?) 由于此限制,当SourceFolders.Count>时,我的下面的代码不起作用64.

if (Source.SubFolders.Count > 0)
{
    var threadPoolDoneEvents = new ManualResetEvent[Source.SubFolders.Count];
    for (int i = 0; i < Source.SubFolders.Count; i++)
    {
        try
        {
            if (m_bRegisterCancelled == false)
            {
                threadPoolDoneEvents[i] = new ManualResetEvent(false);
                AddSourceAgs variables = new AddSourceAgs();
                variables.Source = Source;
                variables.SubFolder = Source.SubFolders[i];
                variables.DoneEvents = threadPoolDoneEvents[i];
                ThreadPool.QueueUserWorkItem(AddSourceProcess, variables);
            }
            else
            {
                break;
            }
        }
        catch (System.Exception Ex)
        {
            FireError(this, "AddSource", this.ExBuilder.Message(ERROR_CASE_DATABASE_ADD_SOURCE_EX), Ex);
        }
    }
    WaitHandle.WaitAll(threadPoolDoneEvents);
}

我尝试更换以下行:

WaitHandle.WaitAll(threadPoolDoneEvents);

由此:

foreach (var waitHandle in threadPoolDoneEvents)
    waitHandle.WaitOne();

由此导致意外发生 - 在我的情况下,在100个文件中,随机地完成20-30个文件的处理,然后在其间停止休息。 知道我的概念落后的任何想法吗?任何解决这个问题的方法?我已经尝试了this,但这也会导致一些随机错误,例如处理每个任务两次或类似的事情。

更新 调试之后,我发现由于这行代码抛出了异常,任务失败了:

try
{
    RasterImage image = m_codecs.Load(m_documentNameWithPath, pageNum);
    m_codecs.Save(image, m_outputPath+ "\\\\" + pageNum.ToString("D4") + ".png", RasterImageFormat.Png, 0);
    return true;
}
catch (Exception Ex)
{
    m_conversionErrors.Add(Ex);
    return false;
}

以下是抛出的异常:

Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.

任何解决方案都可以吗?甚至解释这是什么?

1 个答案:

答案 0 :(得分:1)

等待这些事件不会导致任务失败。更有可能是你没有注意到的例外情况(未被捕获或被吞没)。

根据Task进行处理并使用Task.WaitAll。没有限制。您还将获得自动错误传播。