异步任务取消最佳实践:用户与程序

时间:2013-09-19 05:29:11

标签: c# .net task-parallel-library async-await

我正在开发一个库,它在UI线程上执行一些懒惰的空闲后台工作(由于传统的COM使用,它必须是这样)。消费应用可以通过取消令牌取消该任务,或者可以通过用户操作(通过IUserFeedback.Continue)明确取消该任务。我正在尝试按MSDN pattern取消任务。

我的问题是,我应该区分用户取消(并返回false)和调用应用(投掷),如IdleWorker1所做的那样。或者我应该平等地处理这两种情况,只是抛出,就像使用IdleWorker2一样?

我没有接口设计者的任何严格要求(任务基本上永无止境,因此他们只关心到目前为止已经完成了多少工作,并且他们通过{{接收进度) 1}})。

简而言之, IdleWorker1

IUserFeedback.Continue

IdleWorker2

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

1 个答案:

答案 0 :(得分:2)

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

为此,您可以通过应用取消一个CancellationTokenSource,另一个用户取消。然后,您可以使用CreateLinkedSource()将它们合并为一个,并将其标记传递给方法。