代码合约简单地将任务视为任何其他变量一样处理,而不是异步等待结果。因此,以下情况将不起作用,并且会导致合约异常,因为在方法返回时,它是一个未完成的任务,在那个时间点上结果尚未设置。是否有任何合理的解决方案来解决以下情况?
public Task LoadAppModel()
{
Contract.Ensures(app.User != null);
Contract.Ensures(app.Security != null);
Contract.Ensures(app.LocalSettings != null);
return Task.WhenAll(
store.GetUserAsync().ContinueWith(t => { app.User = t.Result; }),
store.GetSecurityAsync().ContinueWith(t => { app.Security = t.Result; }),
store.GetLocalSettingsAsync().ContinueWith(t => { app.LocalSettings = t.Result; }));
}
如果有任何建议,都可以提出来。 :) 我宁愿不打破合同模式。
Task.WaitAll()
代替WhenAll()
怎么样? - ClaiesTask
类在async/await特性出现之前就已经存在了,并且并不总是表示使用它们的方法旨在异步执行... - Claies