我目前正在使用.NET 4和Visual Studio 2010.MSDN表示此版本的.NET框架中没有Task.Delay
。
但是,在我的系统中,ILdasm显示mscorlib(4.0.0.0)中存在Task.Delay
。所以我测试了反射:
typeof (Task).GetMethod("Delay", new []{typeof (int)})
.Invoke(null, new object[]{1000});
这似乎适用于我的电脑。所以我的问题是:
这是否意味着Microsoft以某种方式提供了该方法,但它们只是隐藏它?
使用包装函数以上述方式使用它是否安全?更确切地说,这是否适用于仅安装了.NET 4的其他计算机? (我的系统是Windows 7)
更新
我忘了天气或者没有安装.NET 4.5。所以我从控制面板检查。是的,安装了.NET 4.5.1。
答案 0 :(得分:10)
.NET 4.0中不存在此方法。
你可能是ILspying 4.5。所有.NET 4.x的程序集,在本文发布时通过4.5.2显示v4.0.0.0,更新版本在安装时替换旧版本 - 它们是向后兼容。
当您能够通过反射获取Task.Delay
时,因为您的应用实际上是在.NET 4.5上运行。
当您在Visual Studio中选择框架版本时,它将使用您安装的任何版本,但仅显示该选择中的实际方法 - 您可以将其视为兼容性选择,而不是精确的版本选择
我相信NuGet上的Microsoft.Bcl和Microsoft.Bcl.Async包中的一个包含一个TaskEx.Delay
,您可以使用它在旧框架上模拟它并在使用时路由到内置版本较新的。这些包包含反向移植的API。
答案 1 :(得分:0)
如果没有记录,您无法保证它能够始终如一地工作或完全正常工作。但是你已经知道了:)他们保持不公开,因为他们要么没有足够的时间来充分测试/修复它,要么他们在API需要存在时并不确信。无论哪种方式,您应该问的问题是如何使用.NET4中存在的工具实现您自己的API版本