Параллельные запросы с клиентом WCF - PullRequest
0 голосов
/ 13 ноября 2018

У меня несколько серверов с одинаковым интерфейсом. Я хочу использовать 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;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...