2016-03-21 12 views
-1

Ich habe diese beiden MethodenWie kann ich von der rekursiven Methode zurückkehren und dann die rekursive Methode vom letzten zurückgegebenen Punkt fortsetzen?

private List<DirectoryInfo> GetDirectories(string basePath) 
     { 
      IEnumerable<string> str = MyGetDirectories(basePath); 

      List<DirectoryInfo> l = new List<DirectoryInfo>(); 
      l.Add(new DirectoryInfo(basePath)); 

      IEnumerable<DirectoryInfo> dirs = str.Select(a => new DirectoryInfo(a)); 
      l.AddRange(dirs); 

      return l; 
     } 

Und

static int countDirectories = 0; 
    private IEnumerable<string> MyGetDirectories(string basePath) 
    { 
     try 
     { 
      string[] dirs = Directory.GetDirectories(basePath); 
      if (dirs.Length > 0) 
       return dirs.Union(dirs); 
      countDirectories = countDirectories + dirs.Length; 
      _FileInformationWorker.ReportProgress(countDirectories,dirs); 
      return dirs.Union(dirs.SelectMany(dir => MyGetDirectories(dir))); 
     } 
     catch (UnauthorizedAccessException) 
     { 
      return Enumerable.Empty<string>(); 
     } 
    } 

Und in einem Background DoWork diese

private void _FileInformationWorker_DoWork(object sender, DoWorkEventArgs e) 
     {    
      MySubDirectories = GetDirectories(BasePath).ToArray(); 
     } 

Statt für die Methode MyGetDirectories warten zu beenden ich im DoWork aktualisieren möchten Eventuell die Variable MySubDirectories jedes Mal, wenn die Variable dirs. Veränderung. In diesem Fall ist das erste Mal die Länge 36, also mache ich die Rückkehr und ich sehe, dass MySubDirectories 36 Elemente enthalten. Das Problem ist jetzt, dass das rekursive in der Methode MyGetdirectories nicht fortgesetzt wird. Ich will, dass es weitergeht, also nächstes mal ist die Länge über 0, beim nächsten mal wird es 3 sein, dann aktualisiere MySubDirectories, so dass MySubDirectories jetzt die neuen 3 Elemente enthalten, die in dirs sind.

Ich möchte das rekursive nicht stoppen Ich möchte nur die MySubDirectories in Echtzeit aktualisieren.

Was habe ich versucht, so weit und in den Verfahren MyGetdirectories habe ist, dass ich die Berichterstattung auch die Verz Variable:

_FileInformationWorker.ReportProgress(countDirectories, dirs); 

Dann in der Progress Veranstaltung tat

List<string[]> testing = new List<string[]>(); 
     private void _FileInformationWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      label2.Text = e.ProgressPercentage.ToString(); 
      string[] test = (string[])e.UserState; 
      if (test.Length > 0) 
       testing.Add(test); 
     } 

Aber jetzt i‘ m endet mit einer Liste von string [] Arrays. Und test ist string [] Gibt es eine Möglichkeit, die Zeichenfolge [] in DirectoryInfo [] zu konvertieren?

Antwort

0

Von https://www.microsoft.com/en-us/download/details.aspx?id=14782

// Hand-off through a BufferBlock<T> 
private static BufferBlock<int> m_buffer = new BufferBlock<int>(); 

// Producer 
private static void Producer() 
{ 
    while(true) 
    { 
     int item = Produce(); 
     m_buffer.Post(item); 
    } 
} 

// Consumer 
private static async Task Consumer() 
{ 
    while(true) 
    { 
     int item = await m_buffer.ReceiveAsync(); 
     Process(item); 
    } 
} 

// Main 
public static void Main() 
{ 
    var p = Task.Factory.StartNew(Producer); 
    var c = Consumer(); 
    Task.WaitAll(p,c); 
} 
-1

Das sollte funktionieren.

test.Select (p => new Directory (p)) ToArray();

Verwandte Themen