【问题标题】:Create Parallel Task for several Service Call in C# Parallel Task在 C# 并行任务中为多个服务调用创建并行任务
【发布时间】:2016-09-20 07:10:38
【问题描述】:

我想从各种服务中获取信息。我怎样才能实现所有服务调用可以同时执行使用 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();
    });
}

在上面的代码中,任务被创建,但服务调用是按顺序发生的。我希望将其设为 Parallel。

【问题讨论】:

  • 你有没有尝试过?您是否尝试创建相关任务?你遇到问题了吗?如果您根本不知道如何使用任务,请查看教程。有数百个教程解释了如何启动多个任务。
  • 是的。我试过了,但它一一调用 Task.Factory.StartNew(() => { ... Statements ... });在此我调用了所有的服务。
  • 发布您在问题本身中尝试的内容。顺便说一句,您可以多次致电Task.RunTask.Factory.StartNew 并等待所有结果。虽然这是一个基本概念。您应该首先阅读教程,而不是尝试将一些代码放在一起。您可能会发现还有其他方法可以同时调用多个操作
  • 我更新了代码供您参考。我是面向任务编程的新手。我回顾了一些基本教程,我得到了这个结构。如果我的代码有任何问题,请按照我的要求帮助我。

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


【解决方案1】:

您甚至不需要控制服务,因为它本质上是异步的,您可以利用它。这两者会愉快地相互通信,并给你一个同步服务器和一个异步客户端:

服务器端定义:

[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);
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多