2016-04-06 23 views
2

Akka'yı öğrenmek için yapılan bir alıştırma olarak, basit bir problem için basit bir çözüm yazmaya çalışıyorum - başlangıç ​​klasörünün altındaki dizinleri ve dosyaları nasıl yinelemeli olarak listeleyebilirsiniz.Akka.net içindeki dosyaları numaralandırma

Directory.GetDirectories kullanırsam, tüm dizinleri bellekte okuyacak bir engelleme çağrısı olur. Bu iyi çalışıyor ama bence Akka kullanmanın amacını yener.

Eğer Directory.EnumerateDirectories'i kullanırsam, daha sonra dizinler için Kendime söyle'yi arayabilir veya örneğin dosyayı günlüğe kaydedecek bir Dosya işleyicisinde söyle'yi çağırabilirim.

Sorunum, tüm işlemin ne zaman yapıldığını bilmem, yani dizin geçişim bittiğinde. Program sadece orada oturur ve onu kapatmak için bir şeyler bekler.

Bu soruna yanlış şekilde mi bakıyordum? Bu sorunu çözmek için Akka'da ne gibi seçeneklerim var?

DÜZENLEME: - o zaman alınan ve taranan dizinlerin her amout karşılaştırabilirsiniz - Görev bittiğinde bu yüzden bildiğimiz biz bir çıkış deyimi belirtmek gerekiyor gibi ekle aktör kodu

public class DirectoryActor : UntypedActor 
{ 
    private readonly IActorRef fileActor; 

    private readonly string initialPath; 

    public DirectoryActor(IActorRef fileActor, string initialPath) 
    { 
     this.fileActor = fileActor; 
     this.initialPath = initialPath; 
    } 

    protected override void OnReceive(object message) 
    { 
     foreach (string dir in Directory.EnumerateDirectories(message.ToString())) 
     { 
      Self.Tell(dir); 
      foreach (string file in Directory.EnumerateFiles(dir)) 
      { 
       this.fileActor.Tell(file); 
      } 
     } 
    } 
} 
+0

Oyuncu kodu verebilir misiniz? – profesor79

+0

@ profesor79 Elbette, eklendi. Amaca göre oldukça önemsiz. –

cevap

0

görünüyor.

protected override void OnReceive(object message) 
    {    
     dirReceived++; 
     foreach (string dir in Directory.EnumerateDirectories(message.ToString())) 
     { 
      Self.Tell(dir); 
      dirSentCount++; 
      foreach (string file in Directory.EnumerateFiles(dir)) 
      { 
       this.fileActor.Tell(file); 
      } 
     } 

     if (dirReceived == dirSentCount) 
     { 
      Console.WriteLine("Finished"); 
     } 
     else 
     { 
      Console.Write("."); 
     } 
    } 
1

ki profesor79 cevabı olarak aynı öncül aşağıdaki eserlerini Eğer çalışma tamamlandığında tanımlamak için bir sinyal olması gerekir. Bunu yapmanın başka bir yolu, belirli bir süre boyunca herhangi bir mesaj alınmadığında zaman aşımı mesajını tetikleyen ReceiveTimeout özelliğini kullanmak olacaktır.

public class DirectoryActor : UntypedActor 
{ 
    private readonly IActorRef fileActor; 

    private readonly string initialPath; 

    public DirectoryActor(IActorRef fileActor, string initialPath) 
    { 
     this.fileActor = fileActor; 
     this.initialPath = initialPath; 

     this.Context.SetReceiveTimeout(Timespan.FromSeconds(2)); 
    } 

    protected override void OnReceive(object message) 
    { 
     if (message is ReceiveTimeout) return; //No more directories left to enumerate 

     foreach (string dir in Directory.EnumerateDirectories(message.ToString())) 
     { 
      Self.Tell(dir); 
      foreach (string file in Directory.EnumerateFiles(dir)) 
      { 
       this.fileActor.Tell(file); 
      } 
     } 
    } 
} 
İlgili konular