【发布时间】:2013-09-19 17:16:52
【问题描述】:
我正在开发一个库,该库在 UI 线程上执行一些懒惰的空闲后台工作(由于使用旧版 COM,它必须是这种方式)。消费应用可以通过取消令牌取消任务,也可以通过用户操作显式取消任务(通过IUserFeedback.Continue)。我正在尝试按照MSDN pattern 取消任务。
我的问题是,我是否应该像 IdleWorker1 那样区分用户取消(并返回 false)和调用应用程序(抛出)。或者我应该像IdleWorker2一样平等对待这两种情况并直接抛出?
我对界面设计者没有任何严格的要求(任务本质上是永无止境的,所以他们只关心到目前为止实际完成了多少工作,他们通过@987654326 接收进度@)。
简而言之,IdleWorker1:
interface IUserFeedback
{
bool Continue(int n);
}
class IdleWorker1
{
public async Task<bool> DoIdleWorkAsync(CancellationToken ct, int timeSlice, IUserFeedback feedback)
{
bool more = true;
int n = 0;
while (more)
{
ct.ThrowIfCancellationRequested();
more = feedback.Continue(++n);
await Task.Delay(timeSlice);
}
return more;
}
}
IdleWorker2:
class IdleWorker2
{
public async Task DoIdleWorkAsync(CancellationToken ct, int timeSlice, IUserFeedback feedback)
{
int n = 0;
for (;;)
{
ct.ThrowIfCancellationRequested();
if (!feedback.Continue(++n))
throw new TaskCanceledException();
await Task.Delay(timeSlice);
}
}
}
【问题讨论】:
标签: c# .net task-parallel-library async-await