0

ワークフロー

Watch filesがイベントを発生させるたびにShow created file nameを実行する必要があります

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 を配置できません。

ありがとう!

4

1 に答える 1

2

手始めに、Show created file nameアクティビティをWatch filesアクティビティの子アクティビティにして、実行を制御できるようにします。次に、ブックマーク再開コールバックを追加して、Watch filesアクティビティがコールバックでShow created file nameアクティビティに反応してスケジュールできる ようにします。

必要に応じて、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 を使用してそれを行うことができます。戻り値があることを除いて、ActivityAction に似た ActivityFunc を使用した例については、こちらを参照してください。

于 2011-08-19T08:16:40.910 に答える