Параллельные действия, по-видимому, выполняются последовательно
Я изучаю 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 ответа:
Параллельная активность - это не то, что вы думаете-она позволяет вам ждать вещей параллельно, а не выполнять код на основе процессора параллельно. Режим потоковой обработки 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); } }
Надеюсь, что это поможет кому-то другому