Кодовые контракты + Async в .NET 4.5: "Метод или операция не реализованы"

Я получаю следующую ошибку компиляции ccrewrite при использовании Code Contracts 1.4.51019.0 в VS2012 в Windows 7 x64: "Метод или операция не реализованы."

Похоже, что это вызвано комбинацией аксессуаров свойств и использованием методов async, у которых отсутствует внутренний await.

Действия по воспроизведению:

Создайте новую библиотеку классов с включенной проверкой контракта "Полный" Runtime Contract:

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; }
    }
}

Кто-нибудь еще испытал это?

Ответы

Ответ 1

Это, по-видимому, исправлено в версии 1.5 кодовых контрактов.

Ответ 2

Метод async, который не await обычно указывает на ошибку программирования. Существует предупреждение о компиляторе, которое сообщит вам об этой ситуации.

Если вы хотите синхронно реализовать метод с асинхронной подписью, нормальный способ сделать это - реализовать метод не async и вернуть Task, например Task.FromResult<object>(null). Обратите внимание, что при таком подходе исключения генерируются синхронно вместо того, чтобы помещаться в возвращаемый Task.

Ответ 3

За последние несколько месяцев мы устранили многие проблемы с переписыванием асинхронных методов. Я бы посоветовал вам снова попробовать свой код в последнем инсталляторе, и если у вас все еще есть проблемы, предоставьте полный реестр.

Ответ 4

Я считаю, что ключевое слово async просто означает это - либо у вас есть ожидание во время кода, с помощью которого он будет сгенерирован Task и обработан при вызове метода, либо вам нужно явно вернуть задачу.