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

时间:2011-11-21 07:09:14

标签: c# .net multithreading

当我正在开展一个Windows service项目时,我发现在集成以下功能时遇到了麻烦。

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

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

  3. 问题:我将如何wait for all service's response which is called by each different thread?然后再继续进行下一个任务。

    提前致谢。

6 个答案:

答案 0 :(得分:7)

如果您使用的是.NET 4.0,则可以使用任务并行库。

使用新任务启动每个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);

答案 1 :(得分:0)

您可以使用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...
    

答案 2 :(得分:0)

你可以做几件事。第一个选项,你可以从你的服务中生成5个线程,让每个线程联系一个web服务,并等待所有线程在你的主线程中完成(你可以在所有线程上调用Thread.Join - 只需调用Join on the第一个线程,然后是第二个线程......),当它们全部完成后继续处理。

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

答案 3 :(得分:0)

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

void ServiceN()
{
    /////
}

Parallel.Invoke(Service1, Service2, Service3, Service4, Service5);

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

使用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();
    }

更新:

你也可以在创建

之类的线程之后还原它
        int a, b;
        ThreadPool.GetMaxThreads(out a , out b);

        ThreadPool.SetMaxThreads(5, 5);

        // your code 

        ThreadPool.SetMaxThreads(a, b);