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
改变,你仍然有相同的令牌来检查延迟已经完成。
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
改变,你仍然有相同的令牌来检查延迟已经完成。