在我的代码中,我正在使用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,我将系统线程错误任务异常,任务已取消
答案 0 :(得分:3)
您可以这样做
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;
}
}
注意 :由于可能存在更大的线程安全问题,因此实际上并不需要锁定。