2016-09-03 4 views
1

В моем приложении Silverlight. Я должен потреблять услуги WCF. Теперь вопрос в том, что я хочу синхронно использовать асинхронную службу wcf для цикла.Потребляйте асинхронный сервис wcf синхронно в цикле

Услуга является своего рода

private void GetCurrentDateTimeServiceCall(int i) 
{ 
    ExportWcfClient proxy = new ExportWcfClient(); 
    proxy.GetCurrentDateTimeCompleted += ProxyGetCurrentDateTimeCompleted; 
    proxy.GetCurrentDateTimeAsync(i); 
} 

Теперь я вызвать службу в коде.

for(int i=0;i<length;i++) 
{ 
    a[i] =something; 
    GetCurrentDateTimeServiceCall(i); 
    list = a[i]*.895+a[i]*a[i]; 
    blah blah 
} 

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

Но в петле цикла длина различна. Мы не знаем номер. И сервис тот же самый, просто передают в нем различное целое число.

Кстати, я использую Visual Studio 2010, .NET 4. Поэтому я не могу использовать навыки async/await. Спасибо за помощь.

Редактировать

Поскольку служба является асинхронным, так что иногда код ниже GetCurrentDateTimeServiceCall(i); может работать первым. Например, перед вызовом службы прогоните list = a[i]*.895+a[i]*a[i];. Этого не ожидается. Я не могу получить доступ к коду службы. Также я не могу трогать конфигурацию приложения, как это происходит в нашей структуре уровня доступа к данным. Поэтому, возможно, мне нужен флаг или событие или цикл while, чтобы заставить весь поток работать синхронно.

+0

К слову, вы можете: https://blogs.msdn.microsoft.com/bclteam/2012/10/22/using-asyncawait-without-net-framework-4-5/ –

+0

@PeterBons. Не думайте так. Это требует Visual Studio 2012 и Nuget. У меня их нет в Visual Studio 2010. – Bigeyes

+0

ah too bad..my ошибка, не знаю, 2012 был минус –

ответ

0

Клиенты WCF поддерживают синхронные вызовы. Они также должны были быть сгенерированы. Должен быть метод GetCurrentDateTime. Если вам по какой-то причине требуется, чтобы асинхронный API генерировал клиент, который основан на Task (TAP, а не EAP). Затем, если вы хотите сделать это синхронно и по какой-то причине не можете использовать синхронный метод напрямую, вы можете использовать Task.Wait() для блокировки.

Обратите внимание, что сервер не зависит от клиента в том смысле, что клиент может синхронизировать или асинхронно независимо от того, что сервер делает внутренне. Это всегда можно вызвать синхронизацию службы WCF и асинхронную связь.

+0

Да. Но я понимаю, что Silverlight использует только async. См. [Здесь] (https://msdn.microsoft.com/en-us/library/cc197937 (v = vs.95)). – Bigeyes

+0

https://www.google.com/webhp?complete=1&hl=ru&gws_rd=cr&ei=#complete=1&hl=ru&q=silverlight+synchronous+web+service+call, например. http://www.codeproject.com/Articles/31018/Synchronous-Web-Service-Calls-with-Silverlight-Dis Решает ли ваша проблема? В любом случае вы можете генерировать TAP и использовать Wait(), как объяснено. Вы также можете подождать с EAP более неудобно. – usr

+0

Я не могу использовать channelelfactory в моем случае. Я хочу использовать Task и Wait, чтобы попробовать. Но до сих пор нет подсказки. Должен ли я изменить метод void как Task? Для этого нужен код. – Bigeyes

Смежные вопросы