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
发生更改,延迟完成后,您仍有相同的令牌要检查。可能您应该将令牌传递给方法而不是令牌源-然后您可以在不希望其取消时使用。可能您应该将令牌传递给方法而不是令牌源-然后您可以在不希望其取消时使用。