我目前正在构建基于Xamarin的移动应用程序。对于该项目,我创建了一个框架4.5的PCL项目。我使用VS 2013作为开发IDE。现在我想为这个PCL添加一个WCF服务引用。在为此PCL项目添加服务引用时,我注意到禁用了异步操作的生成。请查看图片了解更多详情。
我通过Nuget将BCL.Async包添加到项目中。但我仍然无法从radiobutton列表中访问基于任务的操作(已禁用)。
那么有没有办法在服务客户端生成基于任务的异步操作?
答案 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)。