Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在什么情况下异步方法应该支持取消_C#_.net_Task Parallel Library_Async Await_Cancellation - Fatal编程技术网

C# 在什么情况下异步方法应该支持取消

C# 在什么情况下异步方法应该支持取消,c#,.net,task-parallel-library,async-await,cancellation,C#,.net,Task Parallel Library,Async Await,Cancellation,我目前正在构建一个现有API的支持异步的版本,我很难找到任何关于何时支持取消的指导。BCL中的一些异步方法没有接受CancellationToken的重载,我发现它 并非所有异步方法都必须支持取消 那么,有什么条件值得通过CancellationToken支持取消 我倾向于以下情况: 任何等待调用的方法也支持取消 任何等待的方法的执行时间可能超过n毫秒 方法实现有一个或多个逻辑退出点(例如,提前退出没有副作用) 这些条件是否合理?还有其他方法吗?这只是我的观点,但我要说的是,如果您调用的as

我目前正在构建一个现有API的支持异步的版本,我很难找到任何关于何时支持取消的指导。BCL中的一些异步方法没有接受
CancellationToken
的重载,我发现它

并非所有异步方法都必须支持取消

那么,有什么条件值得通过
CancellationToken
支持取消

我倾向于以下情况:

  • 任何等待调用的方法也支持取消
  • 任何等待的方法的执行时间可能超过n毫秒
  • 方法实现有一个或多个逻辑退出点(例如,提前退出没有副作用)

这些条件是否合理?还有其他方法吗?

这只是我的观点,但我要说的是,如果您调用的
async
方法都支持取消,那么您的方法应该支持取消。同样,如果您正在通过自然异步操作创建一个
wait
able API,那么请尽最大努力支持取消(例如,通过
CancellationToken.Register

我还要说,任何可能需要“很长时间”的(同步)CPU绑定方法都应该定期观察取消令牌(
CancellationToken.throwifccancellationrequest
)。“长时间”是相对的,但作为一个粗略的指导原则,我会说任何超过半秒的事情(在旧的硬件上,而不是我们的8核开发机器上;)


在任何其他情况下,您谈论的是一种不太有用的取消形式——具体来说,取消可能需要任意时间才能生效。例如,如果一些
async
方法支持它,而其他方法不支持它。我不确定取消令牌参数在这种情况下有多有用;你可能想把它放进去,但一定要记录它的局限性。

因此,如果我的异步方法调用了3个其他异步方法,而其中只有2个支持取消,你不认为我的方法也应该支持它吗?我是说,如果所有3个都支持,那么你的方法当然应该支持。如果只有两个人这样做,那么答案就不那么清楚了;你可以把它放进去,但要做好记录。我并不是说你不应该这样做,只是要知道,在任意的时间里,你的取消不会产生任何影响。