2012-12-02 15 views
4

我是Rx的新手,希望在當前項目中使用它。我正在嘗試實現一個文件觀察器系統。至少現在我只對文件創建事件感興趣。但是當我嘗試在代碼下運行時,我得到「Value can not be null error message」。 請有人幫助我與下面的代碼。如何使用反應式擴展實現filewatcher

class Program 
{ 
    static void Main(string[] args) 
    { 
     IDisposable writer = new FileSystemObservable(@"D:\Code\Rx\Dropbox\", "*.*", false) 
          .CreatedFiles 
          .Where(x => (new FileInfo(x.FullPath)).Length > 0) 
          .Select(x => x.Name) 
          .Subscribe(Console.WriteLine); 
     Console.ReadLine(); 
    } 
} 


class FileSystemObservable 
{ 
    private readonly FileSystemWatcher fileSystemWatcher; 

    public FileSystemObservable(string directory, string filter, bool includeSubdirectories) 
    { 
     fileSystemWatcher = new FileSystemWatcher(directory, filter) 
      { 
       EnableRaisingEvents = true, 
       IncludeSubdirectories = includeSubdirectories 
      }; 

     CreatedFiles = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs> 
       (h => fileSystemWatcher.Created += h, 
       h => fileSystemWatcher.Created -= h) 
       .Select(x => new { x.EventArgs }) as IObservable<FileSystemEventArgs>; 

     Errors = Observable.FromEventPattern<ErrorEventHandler, ErrorEventArgs> 
       (h => fileSystemWatcher.Error += h, 
       h => fileSystemWatcher.Error -= h) 
       .Select(x => new { x.EventArgs }) as IObservable<ErrorEventArgs>; 
    } 

    public IObservable<ErrorEventArgs> Errors { get; private set; } 

    public IObservable<FileSystemEventArgs> CreatedFiles { get; private set; } 
} 

回答

5

Select(x => new { x.EventArgs }) as IObservable<ErrorEventArgs> 

.Select(x => new { x.EventArgs }) as IObservable<FileSystemEventArgs>; 

線的結果將始終返回null。

Select(x => new { x.EventArgs })的類型是IObservable<'a>其中'a是一些匿名類型。

您應該改用:

CreatedFiles = 
    Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
     h => fileSystemWatcher.Created += h, 
     h => fileSystemWatcher.Created -= h) 
    .Select(x => x.EventArgs); 

Errors = 
    Observable.FromEventPattern<ErrorEventHandler, ErrorEventArgs>(
     h => fileSystemWatcher.Error += h, 
     h => fileSystemWatcher.Error -= h) 
    .Select(x => x.EventArgs); 
+0

感謝李!現在錯誤消失了,我可以編譯程序。但是,我沒有得到創建的文件列表。 –

+0

除了這個CreatedFiles和錯誤需要被定義爲IObservable >和IObservable > – Dev

+1

@NarayanAkhade - 它對我來說確實很好。我會直接訂閱觀察者的事件以確保它們按照您的預期進行提升,但我認爲您的觀測值已正確定義。 – Lee