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

C# Task.Factory如何运行我们的命令?,c#,task-parallel-library,C#,Task Parallel Library,我有这样一个代码: System.Threading.Tasks.Task task = Task.Factory.StartNew(() => { // go run my web service 1 }); RunMyWeb_Service_2(); 那么这里会发生什么?有没有可能先运行我的第二个web服务,然后再运行我的第一个web服务?有没有办法告诉它先运行我的第一个web服务(除了从线程中取出它!) 有没有可能先运行我的第二个web服务,然后再运行我的第一个web服务

我有这样一个代码:

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

RunMyWeb_Service_2();
那么这里会发生什么?有没有可能先运行我的第二个web服务,然后再运行我的第一个web服务?有没有办法告诉它先运行我的第一个web服务(除了从线程中取出它!)

有没有可能先运行我的第二个web服务,然后再运行我的第一个web服务

当然。现在有两个线程执行这两个方法。他们可以按任何顺序工作。第二种方法可以在第一种方法开始之前完成所有工作,第一种方法可以在第二种方法开始之前完成所有工作,第一种方法可以完成,然后第二种方法完成一半,然后第一种方法,他们可以在一个来回的庄园中完成他们工作的百分之一。您不知道任何一个操作的给定子任务相对于另一个操作的运行顺序,也不知道哪一个将首先完成

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

有没有可能先运行我的第二个web服务,然后再运行我的第一个web服务

当然。现在有两个线程执行这两个方法。他们可以按任何顺序工作。第二种方法可以在第一种方法开始之前完成所有工作,第一种方法可以在第二种方法开始之前完成所有工作,第一种方法可以完成,然后第二种方法完成一半,然后第一种方法,他们可以在一个来回的庄园中完成他们工作的百分之一。您不知道任何一个操作的给定子任务相对于另一个操作的运行顺序,也不知道哪一个将首先完成


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

Parallel.Invoke(
    () => RunMyWebService1(),
    () => RunMyWebService2()
);
这将同时运行两个web服务调用。如果Web服务2依赖于Web服务1的结果,则可以使用
ContinueWith

Task.Run(() => RunWebService1()).ContinueWith(task => RunWebService2());
或者,您也可以反向运行它们

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

如果需要它们同时运行,但在工作线程上运行,则可以在任务中包装Parallel.Invoke

Task.Run(() =>
    Parallel.Invoke(
        () => RunMyWebService1(),
        () => RunMyWebService2()
    );
);
两个web服务调用将在后台线程中同时运行

更新.NET 4.0解决方案

在.NET 4.0框架中仍然可以使用。因为Task.Run是4.5版的唯一特性,所以我们只需要修改Task对象的用法。下面将创建一个后台工作线程并同时运行两个web服务调用

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

webServiceCalls.Start();
这将需要在开始下一个Web服务调用之前完成第一个Web服务调用

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

webCalls.Start();

如果希望它们并行(并发)运行,则可以使用此选项

Parallel.Invoke(
    () => RunMyWebService1(),
    () => RunMyWebService2()
);
这将同时运行两个web服务调用。如果Web服务2依赖于Web服务1的结果,则可以使用
ContinueWith

Task.Run(() => RunWebService1()).ContinueWith(task => RunWebService2());
或者,您也可以反向运行它们

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

如果需要它们同时运行,但在工作线程上运行,则可以在任务中包装Parallel.Invoke

Task.Run(() =>
    Parallel.Invoke(
        () => RunMyWebService1(),
        () => RunMyWebService2()
    );
);
两个web服务调用将在后台线程中同时运行

更新.NET 4.0解决方案

在.NET 4.0框架中仍然可以使用。因为Task.Run是4.5版的唯一特性,所以我们只需要修改Task对象的用法。下面将创建一个后台工作线程并同时运行两个web服务调用

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

webServiceCalls.Start();
这将需要在开始下一个Web服务调用之前完成第一个Web服务调用

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

webCalls.Start();

很可能他们会并行执行。这不是重点吗?很可能他们会并行执行。这不是重点吗?“继续”。。非常有趣。它将在工作线程上运行整个进程,但在第一个任务完成之前,不允许继续执行
中的任务。你可以把这n个链子串起来。哦!我的RunWebService 1非常重。我需要它在自己的线程上运行,如果它们不依赖,请查看我的更新。您可以在后台线程上同时运行这两个线程。如果您不希望第二次呼叫在第一次呼叫完成之前发生,则必须使用
ContinueWith
方法。如果第二次通话可以与第一次通话同时进行,那么我提供的新示例应该会有所帮助。至于缺少的Task.Run,请确保using语句中包含System.Threading.Tasks。您正在使用.NET4.5吗?这是4.5中的一个特性。否则,我将不得不用非4.5解决方案更新我的示例。我添加了一个.NET4.0示例。请查看我添加的链接,了解关于TPL库的更多详细信息。“ContinueWith”。。非常有趣。它将在工作线程上运行整个进程,但在第一个任务完成之前,不允许继续执行
中的任务。你可以把这n个链子串起来。哦!我的RunWebService 1非常重。我需要它在自己的线程上运行,如果它们不依赖,请查看我的更新。您可以在后台线程上同时运行这两个线程。如果您不希望第二次呼叫在第一次呼叫完成之前发生,则必须使用
ContinueWith
方法。如果第二次通话可以与第一次通话同时进行,那么我提供的新示例应该会有所帮助。至于缺少的Task.Run,请确保using语句中包含System.Threading.Tasks。您正在使用.NET4.5吗?这是本书的一个特色