【发布时间】:2013-05-10 20:28:29
【问题描述】:
我们正在考虑将计算某些结果的工作与提交这些结果的工作分开的 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 方法。 - 是否有解决此问题的标准方法?
【问题讨论】:
标签: c# asynchronous task-parallel-library