继续取消的任务

时间:2018-11-20 07:06:26

标签: c# xamarin

在我的代码中,我正在使用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,我将系统线程错误任务异常,任务已取消

1 个答案:

答案 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; 
   } 
}

注意 :由于可能存在更大的线程安全问题,因此实际上并不需要锁定。