• Microsoft .NET
  • WPF и Silverlight
  • Синхронные вызовы веб-службы в Silverlight: Развенчание мифа об исключительной асинхронности

Синхронные вызовы веб-службы в Silverlight: Развенчание мифа об исключительной асинхронности - Среда тестирования Microsoft Silverlight

ОГЛАВЛЕНИЕ

Среда тестирования Microsoft Silverlight

Здесь дано краткое описание опыта использования среды блочного тестирования Microsoft Silverlight. Эта среда качественная, и разработчики Silverlight сами используют ее.
Использование среды блочного тестирования подробно не разбирается, но кратко рассмотрено, как ее настроить и выполнять с ее помощью асинхронные блочные тесты, так как это имеет важное значение.

Начало работы со средой блочного тестирования Microsoft Silverlight

Среда имеет вид нескольких шаблонов Visual Studio. Вместо установки шаблонов можно создать новое приложение Silverlight, сослаться на показанные ниже сборки и внести изменения в метод Application_Startup в App.xaml.

Рисунок: Импорты среды тестирования Silverlight.

void Application_Startup(object sender, StartupEventArgs e)
{
    this.RootVisual = UnitTestSystem.CreateTestPage();
}

Проделанные действия привели к успеху.

Асинхронные тесты

Как оказалось, легко писать блочные тесты для вызываемых асинхронно методов с помощью инструментов тестирования Silverlight. Для выполнения асинхронного теста применяется Microsoft.Silverlight.Testing.AsynchronousAttribute, и при завершении теста вызывается метод TestComplete. TestComplete является методом Microsoft.Silverlight.Testing.SilverlightTest, поэтому надо расширить данный класс, чтобы использовать его.

[TestMethod]
[Asynchronous]
public void InvokeSynchronouslyShouldPerformActionSynchronouslyFromNonUIThread()
{
    ThreadPool.QueueUserWorkItem(delegate
         {
            CallInvokeSynchronouslyWithAction();
        TestComplete();
         });
}

При запуске проекта теста результаты видны в окне браузера.

Рисунок: Вид в браузере прогона теста Silverlight

Заключение

По какой-то причине команда Silverlight проявила правильный подход с синхронными вызовами веб-службы. Несмотря на то, что синхронные вызовы веб-службы не запрещены, при выполнении из потока пользовательского интерфейса они подвешивают приложение. Таким образом, недостает инфраструктуры, не дающей совершать ошибки. Однако удалось решить проблему в приложенных файлах для загрузки.

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

Было бы хорошо, если бы добавился стандартный механизм для выполнения синхронных вызовов веб-службы из потоков, не относящихся к пользовательскому интерфейсу, так как есть обоснованные доводы в пользу этого. До тех пор используйте библиотеку, предоставленную вместе со статьей.