如何取消 HostingEnvironment.QueueBackgroundWorkItem

max*_*ego 6 asp.net async-await cancellation-token

有没有办法取消后台任务 HostingEnvironment.QueueBackgroundWorkItem

CancellationToken哪个通知任务是否被取消,但我该怎么做?参考https://msdn.microsoft.com/en-us/library/dd997396(v=vs.110).aspx

成功取消涉及调用 CancellationTokenSource.Cancel 方法的请求代码

好的。我在哪里可以访问CancellationTokenSource

max*_*ego 6

经过几次尝试我想出了解决方案:

HostingEnvironment.QueueBackgroundWorkItem(ct =>
{
    var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(ct);
    var cancellationToken = linkedTokenSource.Token;
    return Task.Factory.StartNew(() =>
    {
         // do stuff on background
    }, cancellationToken);
});
Run Code Online (Sandbox Code Playgroud)

更新:

确实,任务是不需要的。感谢斯维克提出这个问题。这是没有任务的更详细的代码示例。

HostingEnvironment.QueueBackgroundWorkItem(ct =>
{
    var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(ct);
    // following is a dummy method, but you get the idea.
    // StoreCancellationTokenSourceSoItCanBeUsedSomewhereElse(linkedTokenSource);

    var cancellationToken = linkedTokenSource.Token;

    try
    {
        while(true)
        {
            cancellationToken.ThrowIfCancellationRequested();
            // do bg stuff
        }
    }
    catch (OperationCanceledException ex)
    {
        // either token is in cancelled state
    }
});
Run Code Online (Sandbox Code Playgroud)