簡體   English   中英

多次調用CancellationTokenSource.Cancel是否安全?

[英]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.

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