Параллельные действия, по-видимому, выполняются последовательно


Я изучаю WF4 и застрял в следующем месте. Пожалуйста помочь.Спасибо.

1) я создал статический метод, MyMethod в статическом классе под названием Worker. В рамках этого метода я вызываю поток.Sleep (3000), а затем распечатать "MyMethod" называется.
2) Затем я создал деятельность, DoWork (Дауорк.xaml), который состоит из InvokeMethod (целевой тип-рабочий класс В шаге 1 и MethodName = MyMethod).
3) в основном методе я вызываю 2 метода под названием OutputSequence() и OutputParallel (), которые выглядят следующим образом

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

2 2

2 ответа:

Параллельная активность - это не то, что вы думаете-она позволяет вам ждать вещей параллельно, а не выполнять код на основе процессора параллельно. Режим потоковой обработки WF4 заключается в том, что в рабочем процессе одновременно активен только один поток.

Если вы поместите две задержки в параллель, то оба этих ожидания будут происходить параллельно, а не последовательно, как в последовательности

Идея заключается в том, что вы хотите дождаться ряда действий, когда вы не знаете, в каком порядке они произойдут. Тогда параллельная деятельность завершается, когда все ее дочерние ветви завершены

На самом деле параллельная активность действительно выполняет все ветви одну за другой и не имеет ничего общего с параллельным выполнением кода, как это делают два потока.

Но есть пример MS, который показывает" истинное " параллельное выполнение для блоков внутри параллельной активности. Существует AsyncCodeActivity в .net 4, что позволяет получить параллельное выполнение действий. Пожалуйста, проверьте http://msdn.microsoft.com/en-us/library/ee358731 (VS.100).aspx Ниже вы можете найти скопированный образец из ссылки выше:

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

Надеюсь, что это поможет кому-то другому