CancellationTokenSource正确替换为新的

时间:2016-11-23 18:48:46

标签: c# task token cancellation cancellationtokensource

Window在显示后{5}秒后自动隐藏(ShowWindow方法)。它也可以手动隐藏(HideWindow方法)。这是我目前的实施。

问题:当我打开然后手动关闭窗口时,它会在打开后立即隐藏到1秒。它不应该是设计的。原因是我用新的替换CTS,从不要求取消。我的CTS技能很差,无法正确理解如何正确实现这一点。

public class Window
    {
        public bool Visible { get; set; }
        public CancellationTokenSource HideErrorWindowCTS { get; set; }

        public async void ShowWindow()
        {
            Visible = true;
            await Task.Delay(TimeSpan.FromSeconds(5));
            if (!HideErrorWindowCTS.IsCancellationRequested)
            {
                Visible = false;
            }
        }

        public void HideWindow()
        {
            HideErrorWindowCTS.Cancel();
            HideErrorWindowCTS = new CancellationTokenSource();
            Visible = false;
        }
    }

1 个答案:

答案 0 :(得分:2)

由于ShowWindow查看HideErrorWindowCTS,它会查看新更新的取消令牌来源,而不是您展示时与CTS对应的令牌窗户。只需获取该令牌的ahold并将其存储在等待之前的本地变量中,这样即使HideErrorWindowCTS发生更改,在延迟完成后仍然需要检查相同的令牌。 / p>