1

DataTable に約 1000 行の単純な Parallel.Foreach ループがあります。これらの行のそれぞれが新しいクラスを呼び出しますが、メモリが不足するまでメモリが蓄積されます。パラレルに関して、新しいクラスに適切に配置する方法を知りたいです。あなたがなんて新しい質問を言っているのなら、それは並列とスレッド化が私にとって新しいからです。

  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");
            }
        });
4

3 に答える 3

0

この種の問題は、Parallelではなくasyncを使用することでより適切に対処できます。すべてのリクエストをディッシュアウトし、yaに戻ってきたら処理します。ちょっとした考え。

于 2012-04-05T23:07:14.773 に答える
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");
        }
    }
于 2012-04-05T22:52:38.187 に答える
0

やりたいことは、ループごとに 1 つを初期化するのではなく、スレッドごとに 1 つの 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 オブジェクトが再利用可能であることを前提としています。その状態または何かをリセットする必要がある場合、それは最後のFinallyデリゲート中に行われます(つまり、最後のようなものです(wcc) => { wcc.Reset(); })。

于 2012-04-05T23:45:22.367 に答える