在我的代码中,我正在使用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/

10-11 08:20