Task.Factory如何运行我们的命令?

时间:2014-06-11 18:50:31

标签: c# task-parallel-library

我有这样的代码:

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

RunMyWeb_Service_2();

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

2 个答案:

答案 0 :(得分:3)

  

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

不确定。您现在有两个线程执行这两个方法。他们可以按任何顺序完成工作。第二种方法可以在开始第一种方法之前完成所有工作,第一种方法可以在开始第二种方法之前完成所有工作,第一种方法可以做到,第二种方法可以做,然后第二种方法做一半,然后是第一种,它们每种方法都可以做到1/100他们在一个来回庄园里的工作。你不知道任何一个操作的任何给定子任务相对于另一个操作的命令是什么顺序,你也不知道哪一个将首先完成。

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

答案 1 :(得分:2)

如果您希望它们并行(并发)运行,您可以使用它。

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

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

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

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

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

<强>更新

如果你需要它们同时运行,但是在工作线程上,你可以将Parallel.Invoke包装在一个Task中。

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

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

.NET 4.0解决方案的更新

Task Parallel Library仍然可以在.NET 4.0框架中使用。由于Task.Run是一个仅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();