在 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 服务参考设置中禁用基于任务的异步操作的主要内容,如果未能解决你的问题,请参考以下文章
在 TPL 任务中包装 .NET Remoting 异步方法