Я указал на это команде Async, как и другие. В настоящее время Contracts и Async являются (почти) взаимоисключающими. Так что, по крайней мере, некоторые люди в Microsoft знают об этой проблеме, но я не знаю, что они собираются с этим делать.
Я не рекомендую писать асинхронные методы как оболочки для методов синхронизации. На самом деле, я бы хотел поступить наоборот.
Предварительные условия могут работать. Я не пробовал это недавно; вам может понадобиться небольшая оболочка для вашего асинхронного метода, включающая предварительные условия.
Постусловия в значительной степени нарушены.
Утверждения и предположения работают нормально, но статическая проверка действительно ограничена, потому что постусловия нарушены.
Инварианты не имеют особого смысла в мире Async, где изменчивое состояние имеет тенденцию просто мешать. (Async мягко отталкивает вас от ООП к функциональному стилю).
Надеемся, что в VS vNext контракты будут обновлены с помощью асинхронного рода постусловий, что также позволит статической проверке лучше работать с утверждениями в асинхронных методах.
В то же время вы можете создать притворное условие, написав предположение:
// Synchronous version for comparison.
public static string Reverse(string s)
{
Contract.Requires(s != null);
Contract.Ensures(Contract.Result<string>() != null);
return ...;
}
// First wrapper takes care of preconditions (synchronously).
public static Task<string> ReverseAsync(string s)
{
Contract.Requires(s != null);
return ReverseWithPostconditionAsync(s);
}
// Second wrapper takes care of postconditions (asynchronously).
private static async Task<string> ReverseWithPostconditionAsync(string s)
{
var result = await ReverseImplAsync(s);
// Check our "postcondition"
Contract.Assume(result != null);
return result;
}
private static async Task<string> ReverseImplAsync(string s)
{
return ...;
}
Некоторое использование контрактов кода просто невозможно - например, указание постусловий для асинхронных членов интерфейсов или базовых классов.
Лично я только что полностью избежал контрактов в своем асинхронном коде, надеясь, что Microsoft исправит это через несколько месяцев.