CancellationTokenSource 适当替换为新的

CancellationTokenSource proper replace with new one

Window出现5秒后自动隐藏(ShowWindow方法)。它也可以手动隐藏(HideWindow 方法)。这是我当前的实现。

问题:当我连续几次手动打开然后关闭window时,它会在打开后立即隐藏到1秒。它不应该是设计使然。原因是我用新的 CTS 替换了 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;
        }
    }

因为ShowWindow查看HideErrorWindowCTS,它查看的是新更新的注销令牌来源,而不是您当时的CTS对应的令牌显示 window。只需抓住该令牌并将其存储在局部变量 before 你等待,这样即使 HideErrorWindowCTS 改变,你仍然有相同的令牌来检查延迟已经完成。