3

ワークフロー 4.0 を試しており、カスタム アクティビティを記述して外部実行可能ファイルを開始し、そのプロセスが完了するのを待ってから、ワークフローの後続のステップを再開したいと考えています。

特定のディレクトリにファイルが到着するのを待機するアクティビティを記述する方法を (ページの下部に向かって) 示す次の例を見つけました。

ワークフロー 4.0 でカスタム アクティビティを作成する

この例にはいくつか問題があります。まず、次のコードを追加すると:

void FileCreated(object sender, FileSystemEventArgs e)
{
    instance.ResumeBookmark(bookmarkName, e.FullPath);
    fsw.Dispose();
}

instance.Resumebookmark(...)利用できないようですがinstance.BeginResumeBookmark、ありinstance.EndResumeBookmarkます。

また、ディレクトリの内容を監視するだけでなく、外部プロセスを処理するためにこれを変更する方法もわかりません。

これは、この種のことに対する最良のアプローチですか?

4

2 に答える 2

3

AyncCodeActivity を作成し、ブックマークを完全に避けることをお勧めします。プロセスの終了コードを結果として返すカスタム アクティビティの例を次に示します。

    public sealed class RunProcess : AsyncCodeActivity<int>
    {
        public InArgument<string> FileName { get; set; }
        public InArgument<string> Arguments { get; set; }

        private Func<string, string, int> runProcessAsyncCall;

        protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
        {
            this.runProcessAsyncCall = this.RunProcessImpl;
            return runProcessAsyncCall.BeginInvoke(FileName.Get(context), Arguments.Get(context), callback, state);
        }

        protected override int EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {
            return this.runProcessAsyncCall.EndInvoke(result);
        }

        private int RunProcessImpl(string fileName, string arguments)
        {
            Process p = Process.Start(fileName, arguments);
            p.WaitForExit();
            return p.ExitCode;
        }
    }

一般的に、ブックマークは、外部イベントが長期間発生しない可能性がある場合に最適です。呼び出しているプロセスの存続期間が短い場合は、AsyncCodeActivity を選択することをお勧めします (管理が容易であることは間違いありません)。

于 2009-12-15T22:14:29.347 に答える
2

このアプローチは、他のプロセスを実行する場合に完全に機能します。Process.WaitForExit を使用して、プロセスがいつ完了したかを確認し、オプションで ExitCode を確認してブックマークを再開します。

于 2009-12-11T09:11:37.780 に答える