C# 取消等待中的任务

C# 取消等待中的任务,c#,asynchronous,async-await,task,cancellation,C#,Asynchronous,Async Await,Task,Cancellation,我在玩任务,不知道在抛出异常时如何取消任务。我正在尝试使用TaskCompletionSourcecancel,但它不起作用 有没有一种方法可以在抛出异常时完全停止任务 公共异步任务迁移() { var tcs=new TaskCompletionSource(); 如果(IsDataMigratorItemParametersCorrect()) { 尝试 { 使用(SqlConnection srcconnection=this.SourceConnection) { 等待srcconnec

我在玩任务,不知道在抛出异常时如何取消任务。我正在尝试使用
TaskCompletionSourcecancel
,但它不起作用

有没有一种方法可以在抛出异常时完全停止任务

公共异步任务迁移()
{
var tcs=new TaskCompletionSource();
如果(IsDataMigratorItemParametersCorrect())
{
尝试
{
使用(SqlConnection srcconnection=this.SourceConnection)
{
等待srcconnection.OpenAsync();
使用(SqlCommand srccmd=CreateMigrateTaskCommand(this.SourceForHash,srcconnection))
{
使用(SqlDataReader srcreader=wait srccmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
{
使用(SqlConnection destconnection=this.DestinationConnection)
{
等待destconnection.OpenAsync();
等待CreateStageTable(destconnection,srcreader);
等待批量复制(destconnection,srcreader);
等待合并(destconnection,srcreader);
等待DropTable(destconnection);
}
}
}
}
}
捕获(例外情况除外)
{
Console.WriteLine(DestinationCommand+“已取消\n异常:”+ex.Message);
setCancelled();
}
}
}
私有SqlCommand CreateMigrateTaskCommand(字符串命令查询、SqlConnection连接)
{
SqlCommand-scmd=新的SqlCommand(commandQuery,connection);
返回scmd;
}
专用异步任务合并(SqlConnection conn、SqlDataReader)
{
使用(SqlCommand cmdMerge=conn.CreateCommand())
{
string mergeQuery=SqlGenerator.BuildMergeQuery(reader,DestinationCommand,this.SourceUniqueKey,this.DestinationUniqueKey);
cmdMerge.CommandText=mergeQuery;
cmdMerge.CommandType=CommandType.Text;
cmdMerge.CommandTimeout=0;
等待cmdMerge.ExecuteNonQueryAsync();
WriteLine(“{0}-MERGE START\n”,DestinationCommand);
}
Console.WriteLine(“{0}-合并成功!\n”,DestinationCommand);
}
专用异步任务BulkCopy(SqlConnection conn、SqlDataReader)
{
使用(SqlBulkCopy bcp=newsqlbulkcopy(conn.ConnectionString,SqlBulkCopyOptions.TableLock))//表锁
{
bcp.SqlRowsCopied+=bcp_SqlRowsCopied;
bcp.BatchSize=此.BatchSize;
bcp.EnableStreaming=true;
bcp.BulkCopyTimeout=0;
bcp.after=1000;
字符串destTable=this.DestinationCommand+“_stage”;
bcp.DestinationTableName=destTable;
等待bcp.WriteToServerAsync(读卡器);
}
}
专用异步任务CreateStageTable(SqlConnection conn、SqlDataReader)
{
使用(SqlCommand cmdCreateTable=conn.CreateCommand())
{
尝试
{
字符串createTableQuery=SqlGenerator.BuildCreateTableQuery(读取器,this.DestinationCommand);
cmdCreateTable.CommandText=createTableQuery;
cmdCreateTable.CommandType=CommandType.Text;
等待cmdCreateTable.ExecuteOnQueryAsync();
Console.WriteLine(this.DestinationCommand+“created!”);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
}
专用异步任务DropTable(SqlConnection conn)
{
使用(SqlCommand cmdCreateTable=conn.CreateCommand())
{
尝试
{
字符串tableName=DestinationCommand+“_stage”;
var builder=新的SqlCommandBuilder();
字符串escapedTableName=builder.QuoteIdentifier(tableName);
cmdCreateTable.CommandText=“drop table”+escapedTableName;
Console.WriteLine(escapedTableName+“created!”);
}
捕获(例外情况除外)
{
Console.WriteLine(DestinationCommand+“已取消\n异常:”+ex.Message);
setCancelled();
}
}
}
有两个部分:请求取消(
TaskCompletionSource.setcancelled
)和响应取消请求

当发生异常时,您的代码正在调用
setcancelled
,如果您想在该操作发生异常时取消其他操作,这是正常的


但是,代码中没有任何内容正在侦听取消令牌。它应该传递给支持
CancellationToken
的API,或者定期检查(
CancellationToken.throwifccancellationrequested
),或者附加一个取消回调(
CancellationToken.Register
)。否则,它只是设置了一个标志,没有人检查它。

您的代码示例不完整。我的错。现在编辑:)