Похоже, что параллельные действия выполняются последовательно - PullRequest
2 голосов
/ 22 января 2012

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

1) Я создал статический метод MyMethod в статическом классе с именем Worker.В этом методе я вызываю Thread.Sleep (3000), а затем печатаю «MyMethod» с именем.
2) Затем я создал действие DoWork (DoWork.xaml), которое состоит из InvokeMethod (целевым типом является класс Worker вшаг 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 ]

7 голосов
/ 23 января 2012

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

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

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

1 голос
/ 18 октября 2012

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

Но есть пример MS, который показывает "истинное" параллельное выполнение для блоков внутри параллельной активности. В .net 4 есть AsyncCodeActivity, которая позволяет одновременно выполнять действия. Пожалуйста, проверьте 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);
    }
}

надеюсь, это поможет кому-то еще

...