我正在寻找一种方法来取消已经启动的任务,然后使用新的输入数据重新启动相同的任务。
以下是我编写的示例代码,但它无效。
private CancellationTokenSource _cancellationTokenSource;
public public async Task DoSomething(string input)
{
_cancellationTokenSource.Cancel(true);
_cancellationTokenSource = new CancellationTokenSource();
try
{
Task.Run(async () =>
{
//Asynchronous method code here which uses input like database operations.
await doSomeDataBaseOperationAsync(input);
}, _cancellationTokenSource.Token);
}
catch { }
}
有人可以帮我吗?
答案 0 :(得分:-1)
您需要对方法doSomeDataBaseOperationAsync
进行手动检查,该方法将异步执行,如下面的代码段所示。我通常采用的方法是在方法本身启动时检查取消令牌源的状态。如果在此之前没有请求取消,那么请继续执行整个功能体。
但没有人可以阻止你在方法中更关键的接合点或里程碑进行检查,例如您可能还想在触发数据库调用之前重新检查取消令牌状态一次。
谨慎之言:您只需要确保无论何时在执行方法期间多次进行此类检查并返回中途,您都不会离开状态你的对象处于不一致的状态。如果你不用这种方法改变你班级的任何成员变量那么你应该是好的。
private void doSomeDataBaseOperationAsync(input)
{
if (_cancellationTokenSource.IsCancellationRequested)
return; //stop any further processing.
//do some processing and calculations on the client side
//.....
//.....
//.....
//make a check again before firing DB request
if (_cancellationTokenSource.IsCancellationRequested)
return; //stop any further processing.
//Do database stuff. cancellation has not been requested. Process the DB request.
}