Я внедряю приложение Silverlight, которое сильно использует службы WCF, теперь я имею в виду, что иногда есть несколько длинных вызовов служб, которые блокируют выполнение других вызовов службы.Очередь вызова службы
Эти служебные звонки в конечном итоге заканчиваются. Я хотел бы узнать, может ли его система очереди, которая выполняет вызовы службы один за другим, таким образом длинные вызовы будут удерживать другие вызовы, но не будут вызывать их тайм-аут.
Я использую службы агентов обернуть службы вызовов
public interface IExampleServiceAgent
{
void ProcessData(int a, string b, EventHandler<ProcessDataCompletedEventArgs> callback);
}
Public ExampleServiceAgent1 : IExampleServiceAgent
{
ExampleClient _Client = new ExampleClient();
public void ProcessData(int anInt, string aString, EventHandler<ProcessDataCompletedEventArgs> callback)
{
EventHandler<ProcessDataCompletedEventArgs> wrapper = null;
wrapper = (a,b) =>
{
callback(a,b);
_Client.ProcessDataCompleted -= wrapper;
}
_Client.ProcessDataCompleted += wrapper;
_Client.ProcessDataAsync(anInt,aString);
}
}
приведенный выше агент службы затем будет вызываться из кода следующим образом:
ServiceAgent.ProcessData(1,"STRING", (a,b) =>
{
if (b.Error != null)
{
//Handle Error
}
else
{
//DO something with the data
}
}
Есть ли способ, которым я мог бы поставить эти вызовы службы в очередь и выполнять их один за другим?
Я пробовал обертывать их как действия и добавлять их в очередь, но это не дожидаясь, пока кто-то завершит выполнение перед запуском следующего, и хотя они действительно правильно звонят службе, никакие данные не возвращаются вызывающей ViewModel ,
** Вместо **, я бы сосредоточиться на том, почему эти призывы так долго и, наконец, тайм-аут. А также почему они вызывают ** другие вызовы ** для тайм-аута. Это не естественно. – Aliostad
Помимо добавления уровня очереди на клиента, вы рассмотрели возможность отключения некоторых ограничений по умолчанию для служб WCF на стороне сервера? Блокировка происходит только тогда, когда ограничение на соединение 2 на один IP-адрес или предел MaxConcurrentConnections равны по умолчанию. Предел IP-адреса является вашей первой проблемой, если вы нажимаете на WCF с несколькими асинхронными вызовами. –
Причина, по которой некоторые звонки занимают много времени, - это большие объемы данных, с которыми им приходится иметь дело. если я получаю 2 медленных вызова одновременно, тогда есть высокая вероятность того, что все остальные вызовы будут таймаутом до завершения медленных вызовов. @HiTechMagic есть ли встроенная очередь в WCF для предотвращения блокировки? – Midimatt