2

我正在开发一个库,该库在 UI 线程上执行一些懒惰的空闲后台工作(由于使用旧的 COM,它必须是这种方式)。消费应用程序可以通过取消令牌取消任务,也可以通过用户操作(通过IUserFeedback.Continue)显式取消任务。我正在尝试遵循MSDN 模式来取消任务。

我的问题是,我是否应该像这样区分用户取消(和 return false)和调用应用程序(抛出)IdleWorker1。还是我应该平等对待这两种情况并像对待一样扔掉IdleWorker2

我对界面的设计者没有任何严格的要求(任务本质上是永无止境的,所以他们只关心到目前为止实际完成了多少工作,并且他们通过 接收进度IUserFeedback.Continue)。

简而言之,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;
    }
}

空闲工人2

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

1 回答 1

2

我认为如果你不需要区分这两种类型的取消,被取消的方法甚至不应该知道是谁取消了它。

为此,您将有一个CancellationTokenSource由应用程序取消,另一个由用户取消。然后,您可以将它们组合成一个 usingCreateLinkedSource()并将其令牌传递给该方法。

于 2013-09-19T09:16:52.240 回答