我们安装了Visual Studio 2010 SP1和Async CTP(SP1刷新)。
从VS IDE构建时,使用async/await
关键字的项目的解决方案构建正常。
使用devenv /build "Debug" solution.sln
构建时,一切正常。
然而msbuild @commands.rsp solution.sln
报告:
File.xaml.cs(123): error CS1993: Cannot find all types required by the 'async' modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?
commands.rsp看起来像这样:
/nologo
/p:Configuration=Debug
/m:3
/fileLogger
任何线索?
答案 0 :(得分:4)
请参阅此处的讨论:http://social.msdn.microsoft.com/Forums/uk-UA/async/thread/3d491cb0-a19f-4faf-80a6-5fd05e4e06db
为了更好地理解您的问题,有两点需要澄清:
我将在MS论坛的讨论中引用 SERware 的初步结论:
我认为这与XAML项目的顺序有关 在引用库本身的类时编译程序集。在 在这种情况下,XAML Loader尝试在编译之前编译这些类 引用Async CTP库。因此,关键字“async”不是 识别。
就个人而言,我将看看是否可以拆分程序集以解决XAML中依赖项编译的顺序
进一步调查后补充: 正如我所知,解释更令人失望:.NET 4.5(Beta)取代了.NET 4.0。此外,异步/等待相关类型的签名已在内部更改。因此,目前还没有办法同时使用VS 2010 + AsyncATP和VS11 Beta。 - Yuri S. 2分钟前
答案 1 :(得分:0)
我自己受到了这种打击,由于种种原因,我无法将项目升级到.NET 4.5,所以我不得不开发一种解决方法。
由于这对于具有指向自身的xmlns
声明的XAML项目来说只是一个问题,因此我可以在所引用的所有其他项目上使用async。这意味着我的架构仍在使用async / await,并准备好以后再迁移到.NET 4.5。
但是在受影响的XAML项目中,我只是手动实现(很差)等待编译器另外完成的事情。
所以之前的代码是干净的:
try
{
var foo = GetFoo();
foo.DoStuff();
var data = await foo.GetDataAsync();
bar.WorkOnData(data);
}
catch (Exception ex)
{
// Logging, throw up a popup, whatever...
HandleError("Failed to get data", ex);
}
现在变成了这个:
var foo = GetFoo();
foo.DoStuff();
var getDataTask = foo.GetDataAsync();
getDataTask.ContinueWith(t =>
{
if (t.IsFaulted)
{
// Logging, throw up a popup, whatever...
HandleError("Failed to get data", t.Exception);
return;
}
if (t.Status == TaskStatus.RanToCompletion)
{
bar.WorkOnData(t.Result);
}
});
当然不理想,这就是async/await
创建要解决的问题。但它确实可以作为短期解决方法,至少对于await
的简单使用。