我已经向其他人指出了这一点。目前,Contracts和Async是(几乎)相互排斥的。所以,至少有一些微软的人知道这个问题,但我不知道他们打算怎么做。
我不建议将异步方法编写为同步方法的包装。事实上,我倾向于做相反的事情。
先决条件可以工作。我最近没有尝试过;您可能需要围绕包含前提条件的异步方法进行小包装。
后续条件已经非常糟糕。
断言和假设可以正常工作,但静态检查器是非常有限的,因为后置条件被破坏。
不变量在异步世界中并没有多少意义,在异步世界中,可变状态往往会阻碍。 (异步轻轻推开你从面向对象和功能风格)。
希望在VS vNext中,Contracts将被更新为异步感知类型的后置条件,这也将使静态检查器能够更好地使用异步方法中的断言。
在此期间,您可以通过编写一个假设有一个假装,后置条件:代码合同
// 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 ...;
}
一些用法只是是不可能的 - 例如,在接口或基类成员的异步指定后置条件。
就个人而言,我只是完全避开了我的异步代码中的契约,希望微软能够在几个月内修复它。
没有人说的MVP不能搞错。 – 2012-02-06 22:50:19