Асинхронные операции (службы WCF Data Services)
При разработке веб-приложений необходимо учитывать наличие большего времени задержки между клиентом и сервером по сравнению с приложениями, выполняющимися во внутренних сетях. Для оптимизации производительности и взаимодействия приложения с пользователем рекомендуется использовать асинхронные методы классов DataServiceContext и DataServiceQuery при доступе к серверам Службы WCF Data Services через Интернет.
Хотя серверы Службы WCF Data Services обрабатывают запросы HTTP асинхронно, некоторое методы клиентской библиотеки служб Службы WCF Data Services являются синхронными и ожидают завершения всего обмена запрос-ответ до продолжения выполнения. Асинхронные методы клиентской библиотеки служб Службы WCF Data Services не ожидают завершения этого обмена и дают возможность приложению в это время поддерживать быстро реагирующий пользовательский интерфейс.
Асинхронные операции можно выполнять с помощью пары методов классов DataServiceContext и DataServiceQuery, которые соответственно начинаются со слова Begin и End. Методы Begin регистрируют делегат, который будет вызван службой по завершении операции. Методы End должны вызываться в делегате, зарегистрированном для обработки обратного вызова по завершении операций. При вызове метода End для завершения асинхронной операции сделать это нужно с использованием того же экземпляра DataServiceQuery или DataServiceContext, который использовался для запуска операции. Каждый метод Begin принимает параметр state, который может передавать объект состояния в метод обратного вызова. Этот объект состояния извлекается из интерфейса IAsyncResult, предоставляемого методом обратного вызова и используемого при вызове соответствующего метода End для завершения асинхронной операции. Например, если передать экземпляр DataServiceQuery в качестве параметра state при вызове применительно к экземпляру метода BeginExecute, тот же экземпляр DataServiceQuery возвращается интерфейсом IAsyncResult. Этот экземпляр DataServiceQuery используется затем при вызове метода EndExecute для завершения операции запроса. Дополнительные сведения см. в разделе Как выполнить асинхронные запросы службы данных (службы WCF Data Services).
Примечание |
---|
Клиентские библиотеки, предоставленные в среде .NET Framework для Silverlight, поддерживают только асинхронные операции.Дополнительные сведения см. в разделе Службы данных WCF (Silverlight). |
Клиентские библиотеки .NET Framework поддерживают следующие асинхронные операции.
Операция | Методы |
---|---|
Выполнение запроса DataServiceQuery. |
|
Выполнение запроса из контекста DataServiceContext. |
|
Выполнение пакетного запроса из контекста DataServiceContext. |
|
Загрузка связанной сущности в контекст DataServiceContext. |
|
Сохранение изменений в объектах контекста DataServiceContext |
Вопросы использования потоков в асинхронных операциях
В многопоточном приложении делегат, зарегистрированный как метод обратного вызова для асинхронной операции, не обязательно вызывать в том же потоке, который использовался для вызова метода Begin, создавшего первоначальный запрос. В приложении, в котором метод обратного вызова должен быть вызван из определенного потока, необходимо выполнить явный маршалинг выполнения метода End, который обрабатывает ответ, в нужный поток. Например, в приложениях на основе Windows Presentation Foundation (WPF) и на основе Silverlight необходимо выполнить маршалинг ответа обратно в поток пользовательского интерфейса с помощью метода BeginInvoke объекта Dispatcher. Дополнительные сведения см. в разделе Querying the Data Service (WCF Data Services/Silverlight).