12

我目前正在构建一个基于Xamarin的移动应用程序。对于那个项目,我创建了一个框架4.5的PCL项目。我使用VS 2013作为开发IDE。现在我想为这个PCL添加一个WCF服务引用。在向此PCL项目添加服务引用时,我注意到禁用了异步操作的生成。请检查图像的更多细节。在PCL服务参考设置中禁用基于任务的异步操作

enter image description here

我通过的NuGet添加BCL.Async包到项目中。但是我仍然无法从单选按钮列表(禁用它)访问基于任务的的

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

+0

我有完全相同的问题。我在某处读到,在项目属性中禁用定位到wp8可能会启用该选项。但是这对我没有用。 – Michelh91

回答

1

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

您需要通过/parameters交换机通过newAsync(任务)或oldAsync(APM)。

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/

现在,如果有人能想出如何捕获一个故障异常的任务,这将是真棒包装时!