У меня несколько серверов с одинаковым интерфейсом. Я хочу использовать WCF для запроса состояния для разных серверов. Я не хочу делать запросы последовательно, потому что это может занять слишком много времени. Поэтому я помещаю каждый запрос в отдельный поток, сокращаю время ожидания до 2 секунд, ожидаю завершения всех потоков и возврата состояний.
Но все равно выполняется последовательно. В WCF должно быть что-то более глубокое, что препятствует параллельному выполнению запросов. Или что я могу сделать? После поиска в сети в течение дня, я прошу вас. Пожалуйста, помогите.
Это код:
public class StateCollector {
private ChannelFactory<IMyService> channelFactory;
private readonly string myEndpointAddressTemplate = "http://{0}:14502/myservice";
public StateCollector(){
//Instantiating the ChannelFactory is expensive, so we just have one.
BasicHttpBinding binding = new BasicHttpBinding();
channelFactory = new ChannelFactory<MyService>(binding);
}
public List<MyState> LoadStatus() {
List<string> myAddresses = new List<string>(new []{"service1.xy", "service2.xy", "service3.xy" });
List<Task<MyState>> tasks = new List<Task<MyState>>();
List<MyState> results = new List<MyState>();
//Start a thread for each address to get the state.
foreach (string address in myAddresses) {
Task<MyState> readState = ReadState(address);
tasks.add(readState);
}
//Wait for all threads to finish and read results
Task.WaitAll(tasks.ToArray());
foreach (Task task in tasks) {
results.Add(task.Result);
}
return results;
}
private Task<MyState> ReadState(string serviceAddress) {
Task<MyState> readState = new Task<MyState>(() => {
MyService myService = CreateMyService(serviceAddress);
StateResponse stateResponse = null;
MyState result = MyState.NOCONNECTION;
try {
//This call is blocking parallel execution!
stateResponse = myService.GetState();
result = stateResponse.State;
} catch (System.Exception ignore) {
} finally {
((IClientChannel)myService).Close();
}
return result;
});
readState.Start();
return readState;
}
private MyService CreateMyService(string serviceAddress) {
EndpointAddress endpointAddress = new EndpointAddress(string.Format(myEndpointAddressTemplate, serviceAddress));
MyService myService = channelFactory.CreateChannel(endpointAddress);
IClientChannel contextChannel = (IClientChannel) myService;
contextChannel.OperationTimeout = TimeSpan.FromMilliseconds(2000);
return myService;
}
}