2012-04-05 10 views
1

Ich habe eine einfache Parallel.Foreach-Schleife, die etwa 1000 Zeilen in der DataTable hat, jede dieser Zeilen ruft eine neue Klasse, aber der Speicher wird aufgebaut, bis ich nicht mehr genügend Arbeitsspeicher . Ich frage mich, wie Sie zu einer neuen Klasse in Bezug auf eine Parallele richtig disponieren. Wenn du sagst, was für eine neue Frage das ist, dann ist Parallel und Threading neu für mich.Properway zur Verfügung Klasse in 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"); 
      } 
     }); 

Antwort

0

Wenn WebSiteCrawlerClass Einweg ist dann würden Sie dies tun

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

Okay, lassen Sie mich die neue dumme Frage machen, wie kann ich wissen oder wie mache ich eine Klasse Einweg –

+0

Es muss nicht verfügbar sein, es sei denn, es enthält Verweise auf Instanzen von anderen verfügbaren Arten oder nicht verwalteten Ressourcen . Die Methoden der Klasse müssen jedes von ihnen erstellte Einwegobjekt entsorgen. Suche nach IDisposable/Disposable pattern. – Phil

+0

also im Grunde WebSiteCrawlerClass(): IDisposable –

0

Diese Art von Problem kann besser mit Asynchron statt parallel angesprochen werden. Verteilen Sie alle Anfragen und verarbeiten Sie sie, wenn sie zu Ihnen zurückkommen. Nur ein Gedanke.

+0

Ich habe ähnliche Dinge in F # gemacht, aber es übersetzt sich ziemlich gut in C#/Async. http://stackoverflow.com/questions/4431743/map-reduce-with-f-agents/4438256#4438256 – GregC

0

Sie möchten für jeden Thread ein einzelnes WebSiteCrawlerClass-Objekt erstellen, anstatt für jede Schleife einen zu initialisieren. Dies kann mit der 'localInit' Überladung von Parallel.ForEach erfolgen. Etwas wie:

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) => { }); 

Dies setzt voraus, dass Ihr WebSiteCrawlerClass Objekt wiederverwendbar ist. Wenn Sie seinen Zustand oder etwas zurücksetzen müssen, geschieht dies während des Finally-Delegaten am Ende (so etwas wie (wcc) => { wcc.Reset(); } am Ende).

Verwandte Themen