在Parallel.Foreach中处理类的正确方法

时间:2012-04-05 22:46:40

标签: c#

我有一个简单的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");
            }
        });

3 个答案:

答案 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(); })。