[英]A call to CancellationTokenSource.Cancel never returns
[英]Is it safe to call CancellationTokenSource.Cancel multiple times?
例如,如果我想取消Dispose()
調用中的某些操作( 可以多次調用 ),那么我是否需要編寫
public void Dispose()
{
if (!cancellationTokenSource.IsCancellationRequested)
{
cancellationTokenSource.Cancel();
}
}
還是簡單就足夠了
public void Dispose()
{
cancellationTokenSource.Cancel();
}
(歡迎您評論在Dispose方法中取消操作是否明智,但這不是這個問題的重點。)
是。
但是, CancellationTokenSource
是尚未CancellationTokenSource
。
從參考源 :
ThrowIfDisposed();
// ...
// fast-path test to check if Notify has been called previously
if (IsCancellationRequested)
return;
這似乎是關於Dispose模式的一個問題,然后是關於CancellationToken或其他任何問題。 我不確定您是否正確實施了上述模式。 這是母版上的官方MS文檔: https : //docs.microsoft.com/zh-cn/dotnet/standard/design-guidelines/dispose-pattern
這是我的解釋:
有兩個處理級別:Dispose和Finalizsation。 由於兩者的代碼非常相似,因此通常將它們組合為一個函數(在C#中通常為Dispose)。 主要區別在於是否將其中繼到包含的類。 您總是中繼一個Dispose調用(中繼通常是Dispose所涉及的)。 您永遠不會中繼Finalization調用(Finalization僅在該實例與GC之間)。
還有兩種情況:一種是直接處理非托管資源。 其中一個僅處理另一個Disposeable類。
直接無損資源
在這種情況下,您要做的第一件事是實現終結器,因此至少GC可以可靠地清除它。 然后,您將IDisposeable實現為附加功能,以便程序員可以使用諸如using模式之類的東西來在運行時清除確定性。
處理實現IDisposeable的東西
您有一個實現IDisposeable的資源(例如文件流引用)。 您在類中實現IDisposeable的唯一目的是將Dispose()調用中繼到所述FileStream。 這是更常見的情況。 大概占所有Dispose實現的95-99%。
這里要記住的一件事是,“處置”和“完成”通常意味着較低級別的清除。 調用dispose的SQLConenction將首先關閉(如果需要)。 您處理掉的文件句柄也將首先關閉。 即使調用cancellationTokenSource.Cancel
不可重復, cancellationTokenSource.Dispose
應在其操作過程中調用Cancel,並且應可重復。 該類本身確實實現了IDisposeable。 並且,如果有任何類,通常只調用Dispose而不是通過取消手動進行清除通常是節省的: https : //docs.microsoft.com/zh-cn/dotnet/api/system.threading.cancellationtokensource?view=網絡框架4.7.2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.