C# CancellationTokenSource正确替换为新的

C# CancellationTokenSource正确替换为新的,c#,task,token,cancellation,cancellationtokensource,C#,Task,Token,Cancellation,Cancellationtokensource,窗口出现5秒后自动隐藏(ShowWindow方法)。它也可以手动隐藏(HideWindowmethod)。这是我当前的实现 问题:当我连续几次手动打开然后关闭窗口时,它会在打开后立即隐藏到1秒。这不应该是故意的。原因是我用新的CTS替换CTS,并且从未要求取消。我在CTS方面的技能很差,无法考虑如何正确地实现这一点 public class Window { public bool Visible { get; set; } public Cancella

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

问题:当我连续几次手动打开然后关闭窗口时,它会在打开后立即隐藏到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的令牌。只需抓取该令牌并在等待之前将其存储在局部变量中,这样即使
HideErrorWindowCTS
发生更改,在延迟完成后仍有相同的令牌要检查。

因为
ShowWindow
查看
HideErrorWindowCTS
,它查看的是新更新的取消令牌源,不是显示窗口时对应于CTS的令牌。在等待之前,只需抓取该标记并将其存储在局部变量中,这样即使
HideErrorWindowCTS
发生更改,延迟完成后,您仍有相同的令牌要检查。

可能您应该将令牌传递给方法而不是令牌源-然后您可以在不希望其取消时使用。可能您应该将令牌传递给方法而不是令牌源-然后您可以在不希望其取消时使用。