代码合同和任务

6 .net c# task code-contracts async-await

代码契约只是像处理任何其他变量那样处理任务,而不是异步地等待结果.因此,以下方案将不起作用,并导致合同异常,因为在方法返回时,它是一个不完整的任务,并且不会在该时间点设置结果.以下方案是否有任何合理的解决方法?

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; }));
}
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激.:)我宁愿不打破合同模式.

i3a*_*non 5

代码合同并async没有很好地结合在一起,所以你无法真正使用Contract.Ensures.

然而,有一个解决方法.您可以将方法从 - Task返回方法更改为一个方法async(无论如何都会更干净)并使用Contract.Assume:

public async Task LoadAppModel()
{
    var userTask = store.GetUserAsync();
    var securityTask = store.GetSecurityAsync();
    var settingsTask = store.GetLocalSettingsAsync();
    await Task.WhenAll(userTask, securityTask,settingsTask);

    app.User = userTask.Result;
    app.Security = securityTask.Result;
    app.LocalSettings = settingsTask.Result;

    Contract.Assume(app.User != null);
    Contract.Assume(app.Security != null);
    Contract.Assume(app.LocalSettings != null);
}
Run Code Online (Sandbox Code Playgroud)