我已經向其他人指出了這一點。目前,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