如何完成任务?工厂运行我们的命令

本文关键字:我们 命令 运行 工厂 完成任务 | 更新日期: 2023-09-27 18:08:17

我有一个这样的代码:

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

那么这里会发生什么?有没有可能它先去了我的第二个web服务,然后回来运行我的第一个web服务?有没有一种方法告诉它首先运行我的第一个web服务(好吧,除了把它从线程中取出!)。

如何完成任务?工厂运行我们的命令

是否有可能首先它去和我的第二个web服务,然后回来并运行我的第一个web服务?

确定。现在有两个线程执行这两个方法。他们可以按任何顺序工作。第二种方法可以在第一种方法开始之前完成所有的工作,第一种方法可以在第二种方法开始之前完成所有的工作,第一种方法可以完成一半的工作,然后第二种方法可以完成一半的工作,然后第一种方法,它们可以在一个来回的范围内各完成1/100的工作。你不知道任何一个操作的子任务相对于另一个操作的顺序是什么,也不知道哪个操作会先完成。

如果您希望它们以特定的顺序执行,可以在单个线程中执行,或者使用TPL模型,您可以将一个操作调度为另一个操作的延续,这确保它不会启动,直到任务完成。

如果你想让它们并行运行,你可以使用这个。

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

将同时运行两个web服务调用。如果Web服务2依赖于Web服务1的结果,则可以使用ContinueWith

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

或者,您也可以反过来运行它们。

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

如果你需要它们同时运行,但是在一个工作线程上,你可以包装并行。在任务中调用。

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

两个web服务调用将在后台线程中同时运行。

.NET 4.0解决方案更新

任务并行库仍然可以在。net 4.0框架中使用。因为任务。运行是4.5独有的特性,我们只需要修改Task对象的用法。下面的代码将创建一个后台工作线程,并发地运行两个web服务调用。
var webServiceCalls = new Task(() =>
    Parallel.Invoke(
        () => RunMyWebService1(),
        () => RunMyWebService2()
    );
);
webServiceCalls.Start();

这将要求第一个webservice调用在开始下一个之前完成。

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