【问题标题】:Code Contracts + Async in .NET 4.5: "The method or operation is not implemented".NET 4.5 中的代码合同 + 异步:“方法或操作未实现”
【发布时间】:2012-10-16 20:14:16
【问题描述】:

在 Windows 7 x64 上的 VS2012 中使用代码合同 1.4.51019.0 时,我从 ccrewrite 收到以下编译错误:“方法或操作未实现。”

这似乎是由属性访问器和使用缺少内部 awaitasync 方法的组合引起的。

复制步骤:

创建一个启用“完整”运行时合同检查的新类库:

namespace CodeContractsAsyncBug
{
    using System.Threading.Tasks;

    public class Service
    {
        // Offending method!
        public async Task ProcessAsync(Entity entity)
        {
            var flag = entity.Flag;
        }
    }

    public class Entity
    {
        public bool Flag { get; set; }
    }
}

有其他人经历过吗?

【问题讨论】:

  • 删除“异步”修饰符可以解决问题,我想?
  • 是的(除非您需要返回一个任务)。
  • 这是 Mike Barnett 的项目。他喜欢收到电子邮件,所以不要犹豫就这个错误向他发送电子邮件。 mbarnett at microsoft dot com

标签: c# .net-4.5 code-contracts async-await c#-5.0


【解决方案1】:

这似乎已在 1.5 版的代码合同中得到修复。

【讨论】:

    【解决方案2】:

    在过去的几个月里,我们修复了许多重写异步方法的问题。我建议您在最新的安装程序上再次尝试您的代码,如果您仍然遇到问题,请提供完整的重现。

    【讨论】:

      【解决方案3】:

      没有awaitasync 方法通常表示编程错误。有一个编译器警告会通知您这种情况。

      如果您希望同步实现具有异步签名的方法,通常的方法是实现非async 方法并返回Task,例如Task.FromResult<object>(null)。请注意,使用这种方法,异常会同步引发,而不是放在返回的 Task 上。

      【讨论】:

      • 我知道它的正确用法,你说得对,修复非异步代码可以解决问题。然而,它仍然是一个代码合同错误:)
      【解决方案4】:

      我相信 async 关键字只是代表这一点 - 要么您在代码期间有一个 await,它将生成一个 Task 并在调用该方法时进行处理,或者您需要显式返回一个 Task。

      【讨论】:

      • 你当然可以在没有await的情况下使用async方法。这通常意味着代码的作者不理解 async 的工作原理(因此会产生警告),但它确实有效,我认为它在极少数情况下会很有用。
      • 还有其他一些细微的差别。例如,从异步方法抛出的异常将始终应用于任务,并且永远不会同步引发。
      猜你喜欢
      • 2013-01-31
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      相关资源
      最近更新 更多