我有一个简单的Parallel.Foreach循环,在DataTable中有大约1000行,这些行中的每一行都调用一个新类,但是,内存会一直存在,直到我的内存不足为止。我想知道如何在并行方面正确地处理新类。如果您正在说出一个新问题,因为并行和线程对我来说是新的。
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 5;
Parallel.ForEach(urlTable.AsEnumerable(),options, drow =>
{
WebSiteCrawlerClass WCC = new WebSiteCrawlerClass();
if (drow.ItemArray[0].ToString().Contains("$"))
{
WCC.linkGrabberwDates(drow.ItemArray[0].ToString(), "www");
}
else
{
WCC.NoDatesCarCrawler(drow.ItemArray[0].ToString(), "www");
}
});
答案 0 :(得分:0)
如果WebSiteCrawlerClass是一次性的,那么你就可以这样做
using( var WCC = new WebSiteCrawlerClass() )
{
if (drow.ItemArray[0].ToString().Contains("$"))
{
WCC.linkGrabberwDates(drow.ItemArray[0].ToString(), "www");
}
else
{
WCC.NoDatesCarCrawler(drow.ItemArray[0].ToString(), "www");
}
}
答案 1 :(得分:0)
使用async而不是Parallel可以更好地解决这类问题。清除所有要求,并在他们回到你的时候处理它们。只是一个想法。
答案 2 :(得分:0)
您要做的是为每个线程创建一个WebSiteCrawlerClass对象,而不是为每个循环初始化一个。这可以使用Parallel.ForEach的'localInit'重载来完成。类似的东西:
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 5;
Parallel.ForEach(urlTable.AsEnumerable(),
options,
() => new WebSiteCrawlerClass(),
(drow, dummyLoopState, WCC) =>
{
if (drow.ItemArray[0].ToString().Contains("$"))
{
WCC.linkGrabberwDates(drow.ItemArray[0].ToString(), "www");
}
else
{
WCC.NoDatesCarCrawler(drow.ItemArray[0].ToString(), "www");
}
return WCC;
},
(wcc) => { } );
这假定您的WebSiteCrawlerClass对象是可重用的。如果您需要重置其状态或其他内容,那么最后委托会在最后委托期间完成(最后是(wcc) => { wcc.Reset(); }
)。