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

Posted

技术标签:

【中文标题】在 PCL 服务参考设置中禁用基于任务的异步操作【英文标题】:Task based asynchronous operation disabled in PCL Service Reference setting 【发布时间】:2014-03-19 11:25:26 【问题描述】:

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

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

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

【问题讨论】:

我也有同样的问题。我在某处读到,在项目属性中禁用对 wp8 的定位可能会启用该选项。但这对我不起作用。 【参考方案1】:

不想打扰你,但你不能在 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/

现在,如果有人能弄清楚如何在包装任务时捕获错误异常,那就太棒了!

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于在 PCL 服务参考设置中禁用基于任务的异步操作的主要内容,如果未能解决你的问题,请参考以下文章

Java如何实现任务超时处理

同步请求和异步请求区别

PCL中的MVVMCross异步和等待方法

在 TPL 任务中包装 .NET Remoting 异步方法

牛逼啊!异步神器:CompletableFuture实现原理和使用场景

在双工 WCF 服务的客户端中使用基于任务的异步模式时出错