我们正在考虑将计算某些结果的工作与提交这些结果的工作分开的 API 模式是:
interface IResults { }
class Results : IResults { }
Task<IResults> CalculateResultsAsync(CancellationToken ct)
{
return Task.Run<IResults>(() => new Results(), ct);
}
void CommitResults(IResults iresults)
{
Results results = (Results)iresults;
// Commit the results
}
这将允许客户端拥有一个启动某些结果计算的 UI,并知道计算何时准备就绪,然后在那时决定是否提交结果。这主要是为了帮助我们处理在计算过程中,UI会允许用户取消操作的情况。我们要确保:
- 取消 UI 仅在操作仍可取消时显示(即,一旦我们在 CommitResults 中,就没有回头路了),所以一旦
CalculateResultsAsync
任务完成,我们就取消取消 UI,只要用户没有取消,继续并调用 commit 方法。 - 我们不希望出现用户点击取消并且无论如何都会提交结果的情况(即竞争条件)。
- 客户端永远不会使用
IResults
其他东西,只会将其传递回CommitResults
.
问题: 一般问题是:这是一个好方法吗?具体来说:
- 由于客户端从不检查,因此将其拆分为两种方法感觉不对
IResults
,他们只是将其交还给 Commit 方法。 - 有没有解决这个问题的标准方法?