У меня есть клиент службы WCF, и он был создан с использованием аргумента /async
с svcutil.exe
, поэтому он использует модель асинхронного программирования . Когда я делаю несколько асинхронных запросов с одним клиентом, хотя он сериализует выполнение этих запросов.
Вот пример, который показывает, как я выполняю запросы parellel.
[TestMethod]
public void AsyncTest()
{
var req1 = Helpers.Request["Symbol"];
var req2 = Helpers.Request["Summary"];
using(var client = new SoapClientAsync(_TcpBinding, _TestRunConfig.ServiceAddress))
{
IAsyncResult[] results = new[]
{
client.BeginExec(req1, new AsyncCallback(asyncComplete), new MyAsyncState { Client = client, Request = req1 }),
client.BeginExec(req2, new AsyncCallback(asyncComplete), new MyAsyncState { Client = client, Request = req2 })
};
WaitHandle[] waits = results.Select(i => (MyAsyncState)i.AsyncState).Select(i => i.WaitEvent).ToArray();
WaitHandle.WaitAll(waits);
var states = results.Select(i => (MyAsyncState)i.AsyncState);
foreach (var state in states)
{
Console.WriteLine(string.Format("client {0}", state.Watch.ElapsedMilliseconds));
Console.WriteLine(string.Format("server {0}", state.Response.ExecutionSummary.Single(i => i.Message == "Total").Duration));
}
}
}
private void asyncRequestComplete(IAsyncResult ar)
{
TestAsyncState state = (MyAsyncState)ar.AsyncState;
state.Response = state.Client.EndExec(ar);
state.Watch.Stop();
state.WaitEvent.Set();
}
Вот вывод, который я вижу:
клиент 26
сервер 24
клиент 53
сервер 26
Сервер сообщает о согласованном времени выполнения ~ 25 мс. Но вполне очевидно, что сериализация каждого запроса выполняется на стороне клиента.
Как правильно выполнить запросы parellel к конечной точке веб-службы с использованием WCF?