簡體   English   中英

在什么情況下Async方法應該支持取消

[英]Under what circumstances should an Async method support cancellation

我目前正在構建現有API的異步啟用版本,我很難找到關於何時支持取消的好主意的任何指導。 BCL中的一些Async方法沒有接受CancellationToken的重載,我發現了這篇MSDN文章

並非所有異步方法都支持取消

那么,有什么條件可以通過CancellationToken支持CancellationToken

我傾向於以下條件:

  • 任何等待的方法也支持取消
  • 任何等待的方法可能需要超過n ms才能執行
  • 方法實現具有一個或多個邏輯出口點(例如,沒有提前退出的副作用)

那些合理的條件嗎? 還有其他人嗎?

這只是我的意見,但我會說,如果你所謂的async方法支持取消,那么你應該。 與此類似,如果您正在通過自然異步操作創建await API,那么請盡力支持取消(例如,通過CancellationToken.Register )。

我還說任何(同步)CPU綁定方法可能需要“長時間”應該定期觀察取消令牌( CancellationToken.ThrowIfCancellationRequested )。 “長時間”是相對的,但作為一個粗略的指導,我會說超過半秒鍾(在較舊的硬件上,而不是我們的8核開發機器;)。

在任何其他情況下,您談論的是一種不太有用的取消形式 - 具體而言,取消可能需要任意時間才能生效。 例如,如果某些async方法支持它,但其他方法不支持。 我不確定在這種情況下取​​消令牌參數會有多大用處; 你可能想把它放進去,但一定要記錄它的局限性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM