代码契约就像对待任何其他变量一样简单地对待Tasks,而不是异步地等待结果。因此,以下情况将不起作用,并会导致Contracts异常,因为在方法返回时,它是一项不完整的任务,并且将不会在该时间点设置结果。在以下情况下,是否有任何合理的解决方法?

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; }));
}

任何建议,将不胜感激。 :)我宁愿不打破契约(Contract)模式。

最佳答案

代码契约(Contract)和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);
}

关于c# - 代码契约(Contract)和任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27096809/

10-11 22:36
查看更多