Как Task.Factory запускает наши команды?

1

У меня такой код:

System.Threading.Tasks.Task task = Task.Factory.StartNew(() =>
{
    // go run my web service 1
});

RunMyWeb_Service_2();

Так что может случиться здесь? Возможно ли, что сначала это идет, и мой второй веб-сервис, а затем возвращается и запускает мой первый веб-сервис? Есть ли способ сказать, что сначала запустите мой первый веб-сервис (ну, за исключением того, что он вытащил его из потоков!).

  • 0
    Ну, по-видимому, они собираются выполнять параллельно. Разве это не весь смысл?
Теги:
task-parallel-library

2 ответа

2
Лучший ответ

Если вы хотите, чтобы они выполнялись параллельно (одновременно), вы можете использовать это.

Parallel.Invoke(
    () => RunMyWebService1(),
    () => RunMyWebService2()
);

Одновременно будут выполняться оба вызова веб-сервисов. Если веб-служба 2 зависит от результата Web Sevice 1, вы можете использовать ContinueWith.

Task.Run(() => RunWebService1()).ContinueWith(task => RunWebService2());

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

Task.Run(() => RunWebService2()).ContinueWith(task => RunWebService1());

Обновить

Если вам нужно, чтобы оба они запускались одновременно, но в рабочем потоке вы можете обернуть Parallel.Invoke в задаче.

Task.Run(() =>
    Parallel.Invoke(
        () => RunMyWebService1(),
        () => RunMyWebService2()
    );
);

Оба вызова веб-службы будут выполняться одновременно, в фоновом потоке.

Обновление для решения.NET 4.0

Параллельная библиотека задач по-прежнему доступна для использования в среде.NET 4.0. Поскольку Task.Run - это только функция 4.5, нам просто нужно изменить наше использование объекта Task. Следующее создаст поток рабочего фона и одновременно вызовет оба вызова веб-службы.

var webServiceCalls = new Task(() =>
    Parallel.Invoke(
        () => RunMyWebService1(),
        () => RunMyWebService2()
    );
);

webServiceCalls.Start();

Это потребует завершения первого вызова веб-службы до начала следующего.

var webCalls = new Task(() => RunWebService1())
    .ContinueWith(task, => RunWebService2());

webCalls.Start();
  • 0
    "ContinueWith" .. очень интересно. Даст ему шанс.
  • 1
    Он запустит весь процесс в рабочем потоке, но не позволит выполнить задачу в ContinueWith до тех пор, пока первая задача не будет завершена. Вы можете последовательно подключить эти n раз.
Показать ещё 6 комментариев
3

Возможно ли, что сначала это идет, и мой второй веб-сервис, а затем возвращается и запускает мой первый веб-сервис?

Конечно. У вас есть два потока, выполняющих эти два метода. Они могут выполнять свою работу в любом порядке. Второй способ мог бы выполнить всю свою работу до начала первого, первый мог бы выполнить всю свою работу до начала второго, первый мог бы иметь, затем второй сделать половину, затем первый, каждый мог бы сделать 1/100-й их работы в загородной усадьбе. Вы даже не представляете, какой заказ какой-либо заданной подзадачи любой операции выполняется по отношению к другой, и вы не знаете, какой из них будет закончен первым.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню