Асинхронная операция на основе задач отключена в настройке справочной системы PCL

В настоящее время я создаю мобильное приложение на основе Xamarin. Для этого проекта я создал проект PCL с фреймворком 4.5. Я использую VS 2013 как среду разработки. Теперь я хочу добавить ссылку на службу WCF на этот PCL. Добавляя ссылку на службу в этот проект PCL, я заметил, что генерация асинхронной операции отключена. Пожалуйста, проверьте изображение для более подробной информации.

enter image description here

Я добавил пакет BCL.Async через Nuget в проект. Но все же я не могу получить доступ к Операции на основе задач из списка радиообъявления (его отключено).

Итак, есть ли способ генерировать асинхронную операцию на основе задач в клиенте обслуживания?

Ответ 1

Ненавижу, чтобы разбить его на вас, но вы не можете создать клиент WCF на основе задач в Xamarin. Причина в том, что Xamarin или Mono реализует набор Silverlight, который является ограниченной реализацией WCF. Таким образом, вам нужно использовать SLSVCUTIL.exe вместо этого (добавление служебной ссылки в Xamarin будет использовать этот инструмент). Клиент Silverlight WCF, созданный SLSVCUTIL, будет основан только на асинхронном режиме.

Все не потеряно! Вы можете легко перенести асинхронный клиент silverlight на клиент, основанный на задачах, используя метод Task.FromAsync.

Образец, взятый с веб-сайта Xamarin:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  var todoItems = await Task.Factory.FromAsync <ObservableCollection<TodoWCFService.TodoItem>> (
    todoService.BeginGetTodoItems,
    todoService.EndGetTodoItems,
    null,
    TaskCreationOptions.None);

  foreach (var item in todoItems) {
    Items.Add (FromWCFServiceTodoItem (item));
  }
  ...
}

https://developer.xamarin.com/guides/xamarin-forms/web-services/consuming/wcf/

Теперь, если кто-то может понять, как поймать исключение Fault при упаковке в Задачи, которые были бы удивительными!

Ответ 2

Я раньше не использовал Xamarin, но я предполагаю APM, и, возможно, Tasks фактически поддерживаются в нем, и это просто ограничение Visual Studio. Попробуйте использовать wsdl.exe вручную для генерации кода. Это инструмент вызова Visual Studio при добавлении служебной ссылки.

Вам нужно пройти через newAsync (Tasks) или oldAsync (APM) через переключатель /parameters.