在我的代码中,我正在使用Sqlserver异步。
如果我在查询中请求CancellationTokenSource,则无法在同一Activity中重新使用它。
例
CancellationTokenSource cts; //Global
cts = new CancellationTokenSource();//OnCreate Method
BtnClik1
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(query, connection))
{
await connection.OpenAsync(cts.Token);
await cmd.ExecuteNonQueryAsync(cts.Token);
}
BtnClick2
if (cts.Token != null)
cts.Cancel();
如果我要按一下BtnClick2的提示,那么我不能再使用BtnClick1,我正在接受错误的System Threadin任务异常,任务已取消
最佳答案
你可以做这样的事情
private CancellationTokenSource _cts;
private object syncObj = new Object();
public void BtnClik1(...)
{
lock(syncObj)
{
_cts = _cts ?? new CancellationTokenSource();
}
...
}
public void BtnClik2(...)
{
lock(syncObj)
{
cts?.Cancel();
cts?.Dispose();
cts = null;
}
}
注意:实际上并不需要锁定,因为可能存在更大的线程安全问题。
关于c# - 继续取消的任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53387863/