2011-08-18 50 views
0

Workflow每一個自定義事件被觸發

我需要執行每次顯示創建的文件名時間執行流觀看文件火災事件

WatchFilesActivity:NativeActivity的

protected override void Execute(NativeActivityContext context) 
    { 
     var fileSystemWatcher = new FileSystemWatcher(context.GetValue(Path)); 
     fileSystemWatcher.IncludeSubdirectories = context.GetValue(IncludeSubdirectories); 
     fileSystemWatcher.Filter = context.GetValue(Filter); 

     var bookmark = context.CreateBookmark(ResumeFileCreatedBookmark); 
     context.GetExtension<FileSystemWatcherExtension>().Start(fileSystemWatcher, bookmark); 
    } 

擴展

public class FileSystemWatcherExtension : IWorkflowInstanceExtension 
    { 
     WorkflowInstanceProxy instance; 
     Bookmark bookmark; 

     public void SetInstance(WorkflowInstanceProxy instance) 
     { 
      this.instance = instance; 
     } 

     IEnumerable<object> IWorkflowInstanceExtension.GetAdditionalExtensions() 
     { 
      yield break; 
     } 

     public void Start(FileSystemWatcher fileSystemWatcher, Bookmark bookmark) 
     { 
      this.bookmark = bookmark; 
      fileSystemWatcher.Created += new FileSystemEventHandler(FileCreated); 
      fileSystemWatcher.EnableRaisingEvents = true; 
     } 

     void FileCreated(object sender, FileSystemEventArgs e)//When the file arrives 
     { 
      instance.BeginResumeBookmark(bookmark, e.FullPath, CompleteResume, null); 
     } 

     void CompleteResume(IAsyncResult ar) 
     { 
      var result = instance.EndResumeBookmark(ar); 
     } 
    } 

這工作很好,但只有一次,並在此之後主機關閉。

我不能把一個WhileActivity,因爲我需要處理連續的速度非常快文件創建和傳入文件的處理時間(顯示創建的文件名,在這種情況下)比文件的創建率

更大謝謝!

回答

2

對於首發我會做出顯示創建的文件名活動觀看文件活動的子活動,因此它可以控制它的執行。接下來,我將添加一個書籤恢復回調使觀看文件活動可以作出反應,並安排顯示創建的文件名回調活動。

可選方案,您可能希望創建與BookmarkOptions.MultipleResume你的書籤,所以你可以根據需要處理儘可能多的文件事件,只有當你想這樣做的移動。

public class WatchFilesActivity : NativeActivity 
{ 
    public Activity Child {get; set;} 

    protected override void Execute(NativeActivityContext context) 
    { 
     var fileSystemWatcher = new FileSystemWatcher(context.GetValue(Path)); 
     fileSystemWatcher.IncludeSubdirectories = context.GetValue(IncludeSubdirectories); 
     fileSystemWatcher.Filter = context.GetValue(Filter); 

     var bookmark = context.CreateBookmark(ResumeFileCreatedBookmark, OnFileCreated, BookmarkOptions.MultipleResume); 
     context.GetExtension<FileSystemWatcherExtension>().Start(fileSystemWatcher, bookmark); 
    } 

    protected void OnFileCreated(NativeActivityContext context, Bookmark bookmark, object value) 
    { 
     var fileName = (string)value 
     context.ScheduleActivity(Child); 
    } 
} 

注意:在記事本中鍵入的代碼可能會導致錯別字。

如果你需要傳遞到子活動的文件名,你可以使用ActivityAction來做到這一點。有關使用ActivityFunc的示例,請參閱here,它與ActivityAction一樣,除了它也具有返回值。

+0

的最佳解決方案!我不會將其標記爲響應,因爲「顯示創建的文件名」必須由用戶輕鬆設置(在流程中),如圖中所示。我將嘗試將Watch Files作爲序列的複合活動,然後完成。任何幫助將受到歡迎。 –

+0

如果使用ActivityAction它很容易使類似的ForEach活動所在的文件名顯示爲用戶自定義的變量名。點燃反射器,看看ForEach 的內部,看看它有多簡單。 – Maurice

+0

我想讓流量用戶在WatchFiles之後拖動任何活動。 類似於: 'context.ScheduleActivity(*/next activity * /);' –

相關問題