2012-01-22 13 views
2

私はWF4を学習しており、次の場所で立ち往生しています。助けてください。ありがとうございます。並列アクティビティが順番に実行されているように見える

1)静的メソッドMyMethodをWorkerという静的クラスに作成しました。このメソッドの中で私はThread.Sleep(3000)を呼び出し、 "MyMethod"という名前で印刷します。
2)その後、InvokeMethod(ターゲットタイプはステップ1のWorkerクラスとMethodName = MyMethod)で構成されるDoWork(DoWork.xaml)というアクティビティを作成しました。それはターゲットメソッドを呼び出すよう

private static void OutputSequence()    
{   
    Sequence s = new Sequence() { Activities = new DoWork(), new DoWork() } };  
    WorkflowInvoker.Invoke(s);  
} 

private static void OutputParallel()    
{   
    Parallel p = new Parallel() { Branches = new DoWork(), new DoWork() } };  
    WorkflowInvoker.Invoke(p);  
}  

OutputSequence()は()の順序で二回OKであり、以下のようにメイン方法において
3)は、IであるOutputSequence()とOutputParallel()と呼ばれる2つのメソッドを呼び出すが、パラレルも同様に順番に実行されるようです。私はそれを並行して実行することを期待しました。
私は何が欠けています。

答えて

7

パラレルアクティビティは、あなたが思うものではありません。パラレルで、CPUベースのコードをパラレルに実行しないように、パラレルで待つことができます。 WF4スレッドモードは、ワークフローでアクティブなスレッドが1つだけ存在することです。

あなたは対照的に、これらの待機の両方が

彼らはシーケンスと同じように順番に並列に発生するであろう、その後、並列に2つの遅延を入れた場合のアイデアは、あなたがしたときドンアクションの数を待ちたいですそれらが起こる順序を知ることはできません。その子ブランチの全てが

1

を完了したときに、並列活動は、二つのスレッドが行うように実際の並列活動は本当に、一つ一つすべての分岐を実行し、同時コード実行に関連するものを持っていない完了です。

しかし、並列活動の内部ブロックのための「真」の同時実行を示したMSのサンプルは、そこにあります。 .net 4には、アクティビティの同時実行を可能にするAsyncCodeActivityがあります。

public sealed class GenerateRandom : AsyncCodeActivity<int> 
{ 
    static Random r = new Random(); 

    protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) 
    { 
     // Create a delegate that references the method that implements 
     // the asynchronous work. Assign the delegate to the UserState, 
     // invoke the delegate, and return the resulting IAsyncResult. 
     Func<int> GetRandomDelegate = new Func<int>(GetRandom); 
     context.UserState = GetRandomDelegate; 
     return GetRandomDelegate.BeginInvoke(callback, state); 
    } 

    protected override int EndExecute(AsyncCodeActivityContext context, IAsyncResult result) 
    { 
     // Get the delegate from the UserState and call EndInvoke 
     Func<int> GetRandomDelegate = (Func<int>)context.UserState; 
     return (int)GetRandomDelegate.EndInvoke(result); 
    } 

    int GetRandom() 
    { 
     // This activity simulates taking a few moments 
     // to generate the random number. This code runs 
     // asynchronously with respect to the workflow thread. 
     Thread.Sleep(5000); 

     return r.Next(1, 101); 
    } 
} 

これは他の誰か

のために役立つことを願っています:あなたは上記のリンクからコピー&ペーストのサンプルを見ることができます http://msdn.microsoft.com/en-us/library/ee358731(VS.100).aspx をご確認ください
関連する問題