在每个不同的线程上调用服务,并等待所有服务响应
本文关键字:服务 等待 响应 调用 线程 | 更新日期: 2023-09-27 18:15:20
当我在一个Windows service
项目上工作时,我发现集成以下功能有问题。
-
我需要在一次调用中(在单一方法中)
call 5 different web services on 5 different thread
。 -
我必须
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()
方法来等待线程。
-
每个服务调用创建一个新线程:
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());
-
等待所有线程结束:
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);