我有控制器,我在构造函数中创建一个取消令牌,并在长时间运行的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);
}
}
答案 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