【发布时间】:2011-05-17 21:03:39
【问题描述】:
我在 C#/VS2010 中使用 Parallel.ForEach 循环进行处理,我有几个问题。
首先,我有一个进程需要从远程 Web 服务中提取信息,然后需要动态构建图像 (GDI)。
我有一个将所有功能封装到单个对象中的类,该对象具有两个主要方法 Load() 和 CreateImage(),所有 GDI 管理/WebRequests 在该对象内“黑盒化”。
然后我创建一个包含所有需要处理的对象的 GenericList,并使用以下代码遍历该列表:
try
{
Parallel.ForEach(MyLGenericList, ParallelOptions, (MyObject, loopState) =>
{
MyObject.DoLoad();
MyObject.CreateImage();
MyObject.Dispose();
if (loopState.ShouldExitCurrentIteration || loopState.IsExceptional)
loopState.Stop();
});
}
catch (OperationCanceledException ex)
{
// Cancel here
}
catch (Exception ex)
{
throw ex;
}
现在我的问题是:
- 鉴于列表中可能有一万个要解析的项目,以上代码是解决此问题的最佳方法吗?欢迎任何其他想法
- 我有一个问题,当我开始进程时,对象被创建/加载并且图像创建速度非常快,但是在大约 600 个对象之后,进程开始爬行。它最终没有完成,这正常吗?
在此先感谢 :) 亚当
【问题讨论】:
-
拥有一个除了抛出它捕获的异常什么都不做的catch块有什么意义?
-
嗨,这足以显示我在 May 应用程序中所做的事情,显然没有人对我的错误处理感兴趣,因为它与问题无关 :)
-
很公平,但我会完全省略 catch 块(显然是第二个)——尤其是因为你只是在画一个例子。
标签: c# .net multithreading task-parallel-library