在每个不同的线程上调用服务,并等待所有服务响应

本文关键字:服务 等待 响应 调用 线程 | 更新日期: 2023-09-27 18:15:20

当我在一个Windows service项目上工作时,我发现集成以下功能有问题。

  1. 我需要在一次调用中(在单一方法中)call 5 different web services on 5 different thread

  2. 我必须have to wait for all 5 service's response,然后我必须执行下一个任务。

问题:我将如何wait for all service's response which is called by each different thread?,然后我执行我的下一个任务移动。

在每个不同的线程上调用服务,并等待所有服务响应

如果你使用的是。net 4.0,你可以使用任务并行库

用一个新的Task启动每个web服务调用,然后调用Task。WaitAll传递创建的任务数组。

Task[] taskList = new Task[5];
taskList[0] = System.Threading.Tasks.Task.Factory.StartNew(()=> ServiceCall1());
taskList[1] = System.Threading.Tasks.Task.Factory.StartNew(()=> ServiceCall2());
taskList[2] = System.Threading.Tasks.Task.Factory.StartNew(()=> ServiceCall3());
taskList[3] = System.Threading.Tasks.Task.Factory.StartNew(()=> ServiceCall4());
taskList[4] = System.Threading.Tasks.Task.Factory.StartNew(()=> ServiceCall5());
System.Thread.Tasks.Task.WaitAll(taskList);

您可以使用Thread.Join()方法来等待线程。

  1. 每个服务调用创建一个新线程:

    var service1 = new Thread(() => StartService1());
    var service2 = new Thread(() => StartService2());
    var service3 = new Thread(() => StartService3());
    var service4 = new Thread(() => StartService4());
    var service5 = new Thread(() => StartService5());
    
  2. 等待所有线程结束:

    if (service1.Join() && service2.Join() && service3.Join() && 
        service4.Join() && service5.Join())
        // Continue...
    

您可以做几件事。第一个选项,你可以从你的服务中产生5个线程,让每个线程联系一个web-service,然后等待所有线程在主线程中完成(你可以调用thread。在所有的线程上Join——只在第一个线程上调用Join,然后在第二个线程上调用Join……),当它们都完成后继续你的处理。

这是最简单的事情。尽管如果您关心性能和可伸缩性,您可能希望使用异步通信,并在主线程上调用5个服务并等待5个回调。只有当性能成为问题时,我才会担心。

您可以使用System.Threading.Tasks.Parallel.Invoke

void ServiceN()
{
    /////
}
Parallel.Invoke(Service1, Service2, Service3, Service4, Service5);

您可以使用任务。工厂类。这样,您可以添加各种检查或处理子进程的异常/超时。

Task parent = new Task(() =>
  {
    var cts = new CancellationTokenSource();
    var tf = new TaskFactory<Int32>(cts.Token,
                                    TaskCreationOptions.AttachedToParent,
                                    TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
    var childTasks = new[] {
        tf.StartNew(() => StartService1()),
        tf.StartNew(() => StartService2()),
        tf.StartNew(() => StartService3()),
        tf.StartNew( () => StartService4()),
        tf.StartNew( () => StartService5())
     };
  });
  parent.ContinueWith(p =>
  {
   //(..do something..)
  }, TaskContinuationOptions.None);
  parent.Start();

使用System.Threading.ThreadPool.SetMaxThreads ?

    static void Main(string[] args)
    {
        System.Threading.ThreadPool.SetMaxThreads(5 ,5);
        for (int i = 0; i < 100; i++)
        {
            System.Threading.ThreadPool.QueueUserWorkItem(p => { Console.WriteLine(p.ToString()); System.Threading.Thread.Sleep(10000); }, i);
        }
        Console.Read();
    }

For Update:

你也可以在创建像

这样的线程后恢复它
        int a, b;
        ThreadPool.GetMaxThreads(out a , out b);
        ThreadPool.SetMaxThreads(5, 5);
        // your code 
        ThreadPool.SetMaxThreads(a, b);