【问题标题】:Cannot use await in Portable Class Library for Win 8 and Win Phone 8不能在 Win 8 和 Win Phone 8 的便携式类库中使用 await
【发布时间】:2012-12-16 15:53:17
【问题描述】:

我正在尝试在 Visual Studio 2012 中创建一个可移植类库,用于 Windows 8 应用商店应用和 Windows Phone 8 应用。

我收到以下错误:

'await' 要求类型 'Windows.Foundation.IAsyncOperation' 有一个合适的 GetAwaiter 方法。您是否缺少 using 指令 对于“系统”?

在这行代码处:

StorageFolder guidesInstallFolder = await Package.Current.InstalledLocation.GetFolderAsync(guidesFolder);

My Portable Class Library 针对 .NET Framework 4.5、Windows Phone 8 和 .NET for Windows Store 应用程序。

我在纯 Windows Phone 8 项目中没有得到这行代码的错误,我也没有在 Windows Store 应用程序中得到它,所以我不明白为什么它不能在我的PCL。

GetAwaiter 是 System.Runtime.WindowsRuntime.dll 中的 WindowsRuntimeSystemExtensions 类中的扩展方法。使用对象浏览器,我可以看到此 dll 在 .NET for Windows Store apps 组件集和 Windows Phone 8 组件集中可用,但在 中不可用.NET 可移植子集。我只是不明白如果它在我的两个目标平台上都可用,为什么它不会出现在 Portable Subset 中。

【问题讨论】:

  • 如果您删除 .NET Framework 4.5 作为目标并仅保留 WP8 和 Windows 应用商店,它是否有效?
  • 实际上您无法删除 .NET Framework 4.5,当您尝试删除时说:italic 将自动选择以下框架,因为它们支持在您选择的其他框架:.NET Framework 4.5

标签: c# windows-phone-8 async-await windows-store-apps portable-class-library


【解决方案1】:

您需要 Async 目标包 on NuGet here 才能使 async/await 用于该目标组合。

更新:

试试这个(废话)代码 sn-p 来检查它是否正确使用 async/await。

public async void MyMethodAsync()
{
    var req = WebRequest.Create("");
    await req.GetRequestStreamAsync();
}

但是,即使您解决了async/await 不可用的第一个问题,您调用的Package API 在 PCL 中也不可用。

【讨论】:

  • 实际上我已经尝试过了,但没有帮助。尽管该软件包适用于 .NET 4 和 Win Phone 7.5,但并不感到惊讶,我正在尝试使用 .NET 4.5 和 Win Phone 8
  • 这对于 async/await 无关紧要,但你会遇到我刚刚发现的另一个错误。我已经更新了我的答案。
  • Paul 你的代码 sn-p 编译得很好,我注意到 GetRequestStreamAsync() 函数位于 Microsoft.Threading.Tasks.Extensions.dll 中的 AsyncExtensions 类中,这个 dll 似乎来自您最初建议的异步目标包。所以也许我可以以某种方式重新编写我的代码,以便它不需要它当前尝试使用的 GetAwaiter() 方法?
  • Paul 我还发现这行代码可以为我编译:Package myPackage = Package.Current;
  • 那行对我不起作用:我在一个针对 WP8 和 Windows 应用商店的干净 PCL C# 库中得到 error CS0246: The type or namespace name 'Package' could not be found (are you missing a using directive or an assembly reference?)。你有没有做任何特别的事情来尝试查找这个?
【解决方案2】:

我只是不明白如果它在我的两个目标平台上都可用,为什么它不会出现在 Portable Subset 中。

可移植子集不仅仅是常见的一切。 PCL的每一个成员都是故意的,还有很多成员没有被包括在内。

如果配置文件缺少您需要的内容,请请求 Microsoft 添加(通过 MSConnect 或在 old-but-still-monitored PCL page 的 Q&A 选项卡上)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多