在C#Parallel任务

时间:2016-05-23 11:57:50

标签: c# asynchronous parallel-processing task-parallel-library task

我想从各种服务中获取信息。我怎样才能实现所有服务调用可以同时执行使用C#任务,而不是通过线程

我尝试过的C#代码:

 void GetServiceList() {
    Task.Factory.StartNew(() => {
        var List1 = client1.GetList1();
        var List2 = client2.GetList2();
        var List3 = client3.GetList3();
        var List4 = client4.GetList4();
        var List5 = client5.GetList5();
        var List6 = client6.GetList6();
        var List7 = client7.GetList7();
        var List8 = client8.GetList8();
        var List9 = client9.GetList9();
        var List10 = client10.GetList10();
    });
}

在上面的代码中,创建了任务,但是服务调用是按顺序发生的。我希望将它作为平行。

3 个答案:

答案 0 :(得分:0)

您在这里做的是创建一个匿名方法,依次调用每个服务,然后在并行任务中执行该方法。你需要的是一个任务数组。

List<Task> taskList = new List<Task>();
Task task1=
            Task.Factory.StartNew(() =>
                var List1 = client1.GetList1(););

Task task2=
            Task.Factory.StartNew(() =>
                var List2 = client1.GetList2(););

// and so forth

taskList.Add(task1);
taskList.Add(task2);

Task.WaitAll(taskList.ToArray());

答案 1 :(得分:0)

如果你对你正在呼叫的服务有任何控制权,我建议你调用异步,这样你就可以等待任务而不是使用Task.Factory.StartNew()

答案 2 :(得分:0)

您甚至无需控制服务,因为它本身就是异步,您可以利用这一点。这两个将愉快地相互通信,并为您提供同步服务器和异步客户端:

服务器端定义:

[ServiceContract]
public interface IService
{
    [OperationContract]
    IResult DoStuff(IParameter parameter);
}

客户端定义:

[ServiceContract]
public interface IService
{
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginProcess(IParameter parameter, AsyncCallback callback, object asyncState);
    IResult EndProcess(IAsyncResult result);
}