Как реализовать асинхронный рабочий процесс? - PullRequest
0 голосов
/ 08 апреля 2011
        WorkflowInvoker invoker = new WorkflowInvoker(new Workflow1());

        for (int i = 0; i < 10; i++)
        {
            //invoker.InvokeAsync(myOrders);
            IAsyncResult result = invoker.BeginInvoke(myOrders,new AsyncCallback(WorkflowCompletedCallback),order);
        }

Я использую приведенный выше код для реализации асинхронного рабочего процесса. Я надеюсь запустить этот рабочий процесс 10 раз, и у меня есть что-то похожее с пулом потоков, чтобы поток 10 рабочих процессов мог работать одновременно. Второму не нужно ждать, пока первый закончит свою работу. Мой рабочий процесс очень прост: он вычислит и выведет несколько предложений на экран. После того, как я запустил приведенный выше код, я обнаружил, что кажется, что 10 рабочих процессов запускаются один за другим, а не так, как я надеялся запустить одновременно. Как правильно асинхронизировать рабочий процесс? Спасибо!

Обновление: после некоторой обратной связи с другими я также пытаюсь использовать приложение workflow, чтобы сделать это асинхронно:

        WorkflowApplication wfApp = new WorkflowApplication(new Workflow1(), myOrders);
        for (int i = 0; i < 10; i++)
        {
            wfApp.Run();
        }

        /* Read the end time. */
        DateTime stopTime = DateTime.Now;
        Console.WriteLine(stopTime);
        // Duration
        TimeSpan duration = stopTime - startTime;
        Console.WriteLine("hours:" + duration.TotalHours);
        Console.WriteLine("minutes:" + duration.TotalMinutes);
        Console.WriteLine("seconds:" + duration.TotalSeconds);
        Console.WriteLine("milliseconds:" + duration.TotalMilliseconds);

Вот результат выполнения: 08.04.2011 9:57:49 08.04.2011 9:57:50 Часы работы: 6.27777777777778E-05 минут: 0.00376666666666667 секунды: 0.226 миллисекунды 226: Процесс заказа Заказчик: 10 | Доставка: NextDay | Общая цена: 250 | Стоимость доставки: 10 ProductID: 1 | Количество: 5 | Цена: 50 ProductID: 2 | Количество: 10 | Цена: 200

Кажется, что он асинхронизирован, но только один поток фактически выполняет мой рабочий процесс (не основной поток приложения). Но из вывода я вижу только один поток работает мой рабочий процесс. Как я мог позволить 10 потокам запускать рабочий процесс одновременно? Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Ваш второй пример неверен, так как WorkflowApplication.Run блокирует.

Что касается вашего первого примера, см. Эту статью: http://www.codeproject.com/KB/WF/OperationWorkflowInvoker4.aspx

особенно: http://www.codeproject.com/KB/WF/OperationWorkflowInvoker4/Operat1.jpg

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

0 голосов
/ 08 апреля 2011

Если вы проверяете IAsyncResult внутри вашего цикла, он будет блокироваться до завершения асинхронного метода. IAsyncResult предоставляется для того, чтобы вы могли синхронно использовать асинхронный метод, а это не то, что вы пытаетесь сделать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...