5

経由で取得した子オブジェクトDispose()CancellationTokenSource破棄しますか? それとも、各登録を個別に処分する必要がありますか?CancellationTokenRegistrationToken.Register()

例 1:

async Task GoAsync(CancellationToken ct1, CancellationToken ct2)
{
    using (var cts = CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2))
    {
        cts.Token.Register(() => Debug.Print("cancelled"), false)
        await Task.Delay(1000, cts.Token);
    }
}

例 2:

async Task GoAsync(CancellationToken ct1, CancellationToken ct2)
{
    using (var cts = CancellationTokenSource.CreateLinkedTokenSource(ct1, ct2))
    {
        using (cts.Token.Register(() => Debug.Print("cancelled"), false))
        {
            await Task.Delay(1000, cts.Token);
        }
    }
}
4

1 に答える 1

9

ドキュメントの内容に反して、CancellationTokenRegistrationリソースを解放するのではなく、登録を無効にするために行います。つまり、たとえトークンがキャンセルされたとしても、登録済みのデリゲートをもう起動させたくないということです。

を破棄するCancellationTokenSourceと、関連付けられたトークンをキャンセルできなくなります。これは、登録されたデリゲートが起動しないことを確認できることを意味するため、この場合、登録を破棄する理由はありません。

于 2013-10-10T10:00:31.987 に答える