在PCL服务参考设置中禁用基于任务的异步操作

时间:2014-02-19 08:50:03

标签: wcf asynchronous xamarin portable-class-library xamarin.forms

我目前正在构建基于Xamarin的移动应用程序。对于该项目,我创建了一个框架4.5的PCL项目。我使用VS 2013作为开发IDE。现在我想为这个PCL添加一个WCF服务引用。在为此PCL项目添加服务引用时,我注意到禁用了异步操作的生成。请查看图片了解更多详情。

enter image description here

我通过Nuget将BCL.Async包添加到项目中。但我仍然无法从radiobutton列表中访问基于任务的操作(已禁用)。

那么有没有办法在服务客户端生成基于任务的异步操作?

2 个答案:

答案 0 :(得分:2)

讨厌给你破解,但是你无法在Xamarin中生成基于任务的WCF客户端。原因是Xamarin或Mono实现了Silverlight集合,这是一个有限的WCF实现。因此,您需要使用SLSVCUTIL.exe(在Xamarin中添加服务引用将使用此工具)。 SLSVCUTIL生成的silverlight WCF客户端将仅基于异步。

一切都不会丢失!您可以使用Task.FromAsync方法轻松地将silverlight异步客户端包装到基于任务的客户端。

取自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/

现在,如果有人能够在包装任务时找出如何捕获错误异常,那将是非常棒的!

答案 1 :(得分:1)

我之前没有使用过Xamarin,但是我会假设APM并且实际上可能支持Tasks,这只是Visual Studio的限制。尝试手动使用wsdl.exe生成代码。这是Visual Studio在添加服务引用时调用的工具。

您需要通过newAsync开关传递oldAsync(任务)或/parameters(APM)。