Выполнять поток каждый раз, когда происходит пользовательское событие - PullRequest
0 голосов
/ 19 августа 2011

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);
    }

Extension

    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, потому что мне нужно обрабатывать очень быстрые последовательные создания файлов, а время обработки входящего файла (в данном случае показывать имя созданного файла) превышает скорость создания файла

Спасибо!

1 Ответ

2 голосов
/ 19 августа 2011

Для начала я бы сделал действие Показать созданное имя файла дочерним действием действия Просмотр файлов , чтобы оно могло контролировать его выполнение.Затем я бы добавил обратный вызов возобновления закладок, чтобы Смотреть файлы активность могла реагировать и планировать Показать созданное имя файла активность в обратном вызове.

При желании вы можете захотетьсоздайте свою закладку с помощью 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, который похож на ActivityAction за исключением того, что он также имеет возвращаемое значение.

...