异步等待任务运行 - 找不到

3

VS2012,C#,XAML,Windows Phone7应用程序(刚从Win7/VS2010迁移)。

我刚刚将我的WP7应用程序迁移到Win8/VS2012。(我提到这一点是因为下面的问题可能表明我可能指向了一个不正确的DLL。)应用程序成功迁移。我正在添加一些在VS2012中原型化的附加异步处理,并且被VS标记以下内容不正确:

var _Token = await Task.Run(() => (Token)_Serializer.ReadObject(_Response.GetResponseStream()));

VS表示“System.Threading.Tasks.Task没有包含‘Run’的定义”。我WP7应用程序中System.Threading.Tasks的参考文献指向此位置:\ packages \ Microsoft.Bcl.1.0.16-rc \ lib \ sl4-windowsphone71 \ System.Threading.Tasks.dll。我通过NuGet添加了Microsoft.Bcl.1.0.16-rc以完成对VS2012的迁移。这样做是否不正确?以前我使用AsyncCtpLibrary_Phone,并被建议获取Microsoft.Bcl.Async以解决构建错误,例如: “System.Threading.Tasks.Task类型存在于AsyncCtpLibrary_Phone.dll和c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\WindowsPhone\v8.0\mscorlib.dll中。添加Microsoft.Bcl.Async后,wp7应用程序成功构建并运行。只有在尝试放置在VS2012中原型化的新异步代码之后,才出现了Task.Run问题。app.config包含此条目:
<dependentAssembly bcl:name="System.Threading.Tasks">
    <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.5.11.0" newVersion="1.5.11.0" />
</dependentAssembly>

我需要安装额外的软件包吗?

提前感谢, 保罗


当您在VS2012中进行原型设计时,您的目标平台是什么? 您添加了哪些NuGet包? Microsoft.Bcl无法帮助-所需的软件包是Microsoft.Bcl.Async(它依赖于Microsoft.Bcl,这可能是混淆的关键点)-请参见https://nuget.org/packages/Microsoft.Bcl.Async-此外,它需要针对Windows Phone 7.5进行定位-您的目标是否是这个? 如果您的目标是WP7,则我认为没有其他选项。 - James Manning
嗨James,谢谢你的回复。我已经安装了Micorsoft.Bcl.Async - 如果没有表达清楚,我很抱歉。 - Paul
看起来Task.Run()是4.5框架的一个特性。是否可能从WP7或7.5针对此框架?在VS2012中,项目属性中列出的目标是WP7.1或WP8.0。我尝试安装SDK 7.1.1和7.1,但似乎需要先安装VS2010。在Win8上,我需要S2010才能针对Wp7.5和框架4.5吗? - Paul
啊..我看到我可能没有回答你最初的问题:在VS2012中,由于这是一个迁移,我针对WP7.1进行了定位。虽然我没有看到选择4.5框架的任何方式。 - Paul
wp7.1是自己的目标,类似于silverlight。.NET 4.5与Windows手机是分开的目标。它们在BCL中有一些共同的API,但是在构建时它们是不同的目标。确实存在可移植库的目标,可以在指定需要的框架上运行,这可能是混淆的潜在点。 - James Manning
4个回答

16
在 Microsoft.Bcl.Async 中,与 Async CTP 相同,Run 方法在 TaskEx 类型上而不是 Task 上。

0
上次我检查时,Async CTP在Visual Studio 2012中无法工作,因为它是Visual Studio 2010的扩展。如果你的目标是Windows Phone 7,恐怕你必须继续使用VS 2010。
这里可能有更多有用的信息

1
原始的Async CTP,没错,但是他正在使用Microsoft.Bcl.Async,它适用于(且仅适用于)VS2012,并包括针对WP7.5和WP8的定位 - 请参见http://nuget.org/packages/Microsoft.Bcl.Async/。 - James Manning

0

我认为问题在于您仍然引用旧的异步CTP程序集,其中包含相同类型(根据编译器错误)。这些是在使用VS2010时正确的引用,但现在需要被删除。

在我看来,我会执行以下步骤:

  • 通过NuGet删除Microsoft.Bcl和Microsoft.Bcl.Async(无论您是如何添加它们的)
  • 删除Async CTP库(AsyncCtpLibrary * .dll)
  • 确保编译失败以查找类型
  • 通过NuGet添加Microsoft.Bcl.Async
  • 确保编译成功

我不理解WP7.1与7.5之间的区别,但由于编译器错误提到了WP8 ref,所以我认为您没问题。


-1

NuGet 上的 Microsoft.Bcl.Async dll 不错。

问题在于语法有所不同。不要使用:

await Task.Run(() => ...);

你应该只使用:

await Task.Factory.StartNew(() => ...);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接