在Dispose of Controller中调用cancellationToken.Cancel()?

时间:2017-05-20 15:45:37

标签: c# asp.net-web-api dispose cancellation-token

我有控制器,我在构造函数中创建一个取消令牌,并在长时间运行的await task()中使用它。在Controller.Dispose()中处理取消令牌会导致长时间运行的任务被取消吗?

public class SomeController : BaseInternalController
{
    private CancellationTokenSource cancellationTokenSource;

    public MyController()
    {
        cancellationTokenSource = new CancellationTokenSource();
    }

    public async Task<HttpResponseMessage> Post(SomeData data)
    {
        foreach (var item in data)
        {
            await longRunningTask(item, cancellationTokenSource.token);
        }

    }

    protected override void Dispose(bool disposing)
    {
        if (cancellationTokenSource != null)
        {
            cancellationTokenSource.Cancel();
            cancellationTokenSource.Dispose();
            cancellationTokenSource = null;
        }
        base.Dispose(disposing);
    }
}

1 个答案:

答案 0 :(得分:1)

  

在Controller.Dispose()中处理取消令牌会导致   要取消的长期任务?

取决于您token.ThrowIfCancellationRequested(); 的实施方式。 在此方法中,您应该明确检查是否请求取消:

ThrowIfCancellationRequested

调用此方法后,您的任务将被取消。

取消示例

如果在以下示例中不会调用var cts = new CancellationTokenSource(); Task.Run(() => { while (true) cts.Token.ThrowIfCancellationRequested(); }, cts.Token); ,则任务将永久运行:

cancellationTokenSource

您可以详细了解取消since 2000

请注意,将null设置为NullReferenceException后,您可以在foreach循环中获得public async Task<HttpResponseMessage> Post(SomeData data) { var token = cancellationTokenSource.Token; foreach (var item in data) { await longRunningTask(item, token); } } 。我建议将您的令牌复制到本地变量中:

SETLOCAL ENABLEDELAYEDEXPANSION
set cut= 2
:A
set /a cut = %cut% * %cut%
echo %cut%
pause
goto A