2010-01-12 2 views
0

Всем известно, что в Silverlight все вызовы службы wcf являются асинхронными. Но что мы можем сказать о сроках запросов? Для следующего кода всегда верно, что «Hello A» будет получен сервером до «Hello B»?Сроки вызова wcf в silverlight

ServiceClient proxy = new ServiceClient();
ServiceClient proxy2 = новый ServiceClient();

proxy.SayHelloAsync ("Hello A");
proxy2.SayHelloAsync ("Hello B");

Я запустил код повторно, и сервер всегда получал «Привет A». Это просто удача?

ответ

0

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

Если вам нужно ждать, чтобы закончить, вы должны смотреть на WaitHandle

0

Это была просто удача. Я выполнил почти точно такой же тест, и закончил их с различными различными порядками. Это особенно справедливо в реальных сценариях, где одновременно может выполняться большое количество нерешенных вызовов (например, в приложении чата). Если вам нужно позвонить A, чтобы закончить до вызова B, вам нужно связать их каким-то образом, и ни один из механизмов для этого не будет очень чистым. По моему мнению, рекомендация использовать WaitHandle может быть опасной. Ваш пробег может отличаться, но я обнаружил, что если вы не очень осторожны, использование WaitHandle для управления временем вызовов WCF может остановить критические потоки от работы. Лучше, хотя и сложнее, сделать ваш вызов «B» из метода, который вызывается, когда «A» завершено.

+0

Я согласен с вашим анализом WaitHandle, ему нужно больше заботиться. Во многих случаях вы, вероятно, правы, что цепочка лучше, однако, может стоить дорого, если бы оба вызова могли работать параллельно. Используя пару waithandles на специально выделенном Background thread (1.e, который не имеет ничего другого критического todo), должен быть достаточно простым. – AnthonyWJones

+0

Это тоже мое понимание, но я также знаю, что Silverlight иногда делает некоторые странные вещи, маршируя вызовы WCF на поток пользовательского интерфейса. В последний раз, когда я пытался упростить свой код, используя псевдосинхронный шаблон с ManualResetEvent, я не мог заставить его работать надежно: вызовы никогда не вернутся. Но я не помню точного подхода, который я принимал, и того, кто больше разбирается в проблемах с потоками, чем мне, может быть, повезло больше :-). –