我知道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.
任何解决方案都可以吗?甚至解释这是什么?
答案 0 :(得分:1)
等待这些事件不会导致任务失败。更有可能是你没有注意到的例外情况(未被捕获或被吞没)。
根据Task
进行处理并使用Task.WaitAll
。没有限制。您还将获得自动错误传播。