当我正在开展一个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?
然后再继续进行下一个任务。
提前致谢。
答案 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()
方法等待线程。
每次服务调用创建一个新线程:
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...
答案 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);