我正在寻找一种方法来取消已经启动的任务,然后用新的输入数据重新启动相同的任务。
下面是我编写的示例代码,但它不起作用。
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 { }
}有人能帮我吗?
发布于 2016-10-20 11:00:46
您需要对方法doSomeDataBaseOperationAsync进行手动检查,该方法是异步执行的,如下面的代码片段所示。我通常的做法是在方法本身的开始时检查取消令牌源的状态。如果直到那个时候才请求取消,那么就继续执行整个函数体。
但是,没有人能阻止您在方法中的更关键的节点或里程碑上进行检查,例如,在触发DB调用之前,您可能需要重新检查取消令牌状态一次。
警告词:您只需要确保在执行方法和中途返回时,无论何时进行这样的检查,都不会使对象的状态处于不一致的状态。如果您没有在这样的方法中更改类的任何成员变量,那么您应该是好的。
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.
}https://stackoverflow.com/questions/40152046
复制相似问题