取消CancellationToken会导致CancellationToken异常吗?

问题描述 投票:0回答:1

我有这个代码,我希望得到一些关于CancellationToken的使用的澄清。

我读到了关于使用取消令牌和标志之间区别的问题:

Difference between CancellationTokenSource and exit flag for Task loop exit

我注意到的一件事是它没有提及异常。所以这是我的问题。如果调用Disappearing()方法,那么这会导致发生TaskCanceledException(),这是使用CancellationToken而不是标志的一个很好的理由吗?

public partial class PhrasesFrame : Frame
{
    CancellationTokenSource cts = new CancellationTokenSource();

    public PhrasesFrame(PhrasesPage phrasesPage)
    {
        Device.BeginInvokeOnMainThread(() => ShowCards(cts.Token).ContinueWith((arg) => { }));
    }

    public void Disappearing()
    {
        cts.Cancel();
    }

    public async Task ShowCards(CancellationToken ct)
    {
        while (!ct.IsCancellationRequested)
        {
            await PickCard();
        }
    }

    public async Task PickCard()
    {
        await ShowCard();
    }

    private async Task ShowCard()
    {
        await ShowPhrase();
        await ShowDetail();
    }

    private async Task ShowPhrase()
    {
        while (App.pauseCard || timer1Seconds > 0)
        {
            try
            {
                await Task.Delay(1000, tokenSource1.Token);
            }
            catch (TaskCanceledException)
            {
                // do action
                break;
            }
        }
c# multithreading cancellation-token
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.