c# - 代码契约(Contract)和任务

标签 c# .net async-await task code-contracts

代码契约只是像对待任何其他变量一样对待任务,而不是异步等待结果。因此,以下场景将不起作用,并导致 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; }));
}

如有任何建议,我们将不胜感激。 :) 我宁愿不破坏契约模式。

最佳答案

代码契约和 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/

相关文章:

.net - wsdl.exe/共享类型

c# - 针对频繁重复发生的事件完成 TPL 的高效信号任务

javascript - vue.js:异步钩子(Hook)的替代品

c# - 为什么 GC 在我引用它时收集我的对象?

c# - 如何在 .NET 2.0 (c#/vb.net) 中播放来自不同服务器的 mp3 文件?

c# - 当 UserControl 没有边框样式时,如何在设计 View 中突出显示 UserControl 使用的区域?

c# - MSBuild 不会将直接引用的 dll 复制到 bin 文件夹

c# - 您将功能文档放在哪里以便它显示在智能感知上?

c# - RelayCommand RaiseCanExecuteChanged() 失败

c# - 什么时候可以使用 ClearAllPools 方法?