4

特定のワークフローのn個のインスタンスを作成し、それぞれをシリアルに実行するルーチンがあります。どうすれば非同期でそれらを起動できますか?

現在のpコード:

forloop

// var syncEvent = new AutoResetEvent(false);を作成します WorkflowInstance myInstance = new WorkflowInstance(new SomeWorkflow()、parameters);

            // Events

            // Completed
            myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e) { syncEvent.Set(); };

            // Unhandled Exception
            myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
            {
                // Message
                Console.WriteLine(e.UnhandledException.ToString());
                return UnhandledExceptionAction.Terminate;
            };

            // Aborted
            myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)
            {
                // Message
                Console.WriteLine(e.Reason);
                syncEvent.Set();
            };

            // Run
            myInstance.Run();

            // Wait
            syncEvent.WaitOne();
4

3 に答える 3

4

ここからそこに移動する最も簡単な方法は、複数の待機ハンドルを作成し、WaitAll() で終了することだと思います。最もエレガントなソリューションではありませんが、うまくいくでしょう。ところで、関連付けられた待機ハンドルへの参照を保持する実際のクラスを使用し、anon メソッドを避けることをお勧めします。

        List<ManualResetEvent> items = new List<ManualResetEvent>();

        foreach (Type job in queue)
        {
            WorkflowInstance myInstance = new WorkflowInstance(job, parameters);

            ManualResetEvent syncEvent = new ManualResetEvent(false);
            items.Add(syncEvent);

            // Completed
            myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e) 
            { 
                syncEvent.Set(); 
            };
            // Unhandled Exception
            myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
            {
                // Message
                Console.WriteLine(e.UnhandledException.ToString());
                return UnhandledExceptionAction.Terminate;
            };

            // Aborted
            myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)
            {
                // Message
                Console.WriteLine(e.Reason);
                syncEvent.Set();
            };

            // Run
            myInstance.Run();
        }

        // Wait
        WaitHandle.WaitAll(items.ToArray());
于 2009-09-08T21:18:03.873 に答える
1

並列フレームワークを使用すると、簡単になります。

于 2009-12-03T11:04:33.123 に答える
0

それらを別々のスレッドで実行する必要がありますか? ワークフローを既に使用しているので、ワークフローを使用して「作業を整理」することで問題を解決するのが最も簡単だと思います。

{
    var ArgsToProcess = new List<string> { "arg_one", "arg_two", "arg_three" };

    var delegateArg = new DelegateInArgument<string> { Name = "s" };

    Activity toRun = new ParallelForEach<string>
    {
        Body = new ActivityAction<string>
        {
            Argument = delegateArg,
            Handler = new Workflow1() //Plug your workflow here  
            {
                Arg = delegateArg
            }
        }
    };

    WorkflowInvoker.Invoke(toRun, new Dictionary<string, object>
        {
            {"Values", ArgsToProcess}
        });
}
于 2009-12-30T16:36:56.263 に答える