【问题标题】:CancellationTokenSource proper replace with new oneCancellationTokenSource 正确替换为新的
【发布时间】:2016-11-23 18:48:45
【问题描述】:

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

问题:当我连续几次手动打开然后关闭窗口时,它会在打开后立即隐藏到 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;
        }
    }

【问题讨论】:

  • 也许您应该将 token 传递给方法而不是令牌源 - 然后您可以在不希望取消时使用 CancellationToken.None

标签: c# task token cancellation cancellationtokensource


【解决方案1】:

因为ShowWindow 查看HideErrorWindowCTS,它查看的是新更新的 取消令牌源,而不是您显示窗口时与CTS 对应的令牌。只需抓住该令牌并将其存储在一个局部变量中在您等待之前,这样即使HideErrorWindowCTS 发生变化,您仍然可以在延迟结束后检查相同的令牌。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多