У меня есть текстовое поле, которое не позволяет пользователю писать недопустимые символы, которые я указал с помощью регулярного выражения, и если пользователь записывает какой-либо из них, появляется всплывающее окно и остается там в течение 5 секунд, и я установил эту продолжительность, используя Task.Delay(5000, cts.Token)
который также имеет токен отмены, и пока всплывающее окно отображается на экране, если пользователь вводит разрешенный символ, всплывающее окно исчезает, и эта задача задержки отменяется и удаляется, но если я напишу недопустимый символ, а затем немедленно напишу разрешенный символ, и если я сделаю это очень быстро, то, когда я напишу недопустимый символ, чтобы открыть всплывающее окно, всплывающее окно исчезнет менее чем за 5 секунд (в случайную секунду, я думаю, это потому, что задача задержки отменяется в этот момент а затем вызывает исчезновение всплывающего окна), что является той же проблемой, что и тогда, когда я не использовал токены отмены для отмены задачи задержки. Но с кодами, которые я написал, я не знаю, как задача не отменяется полностью, а может быть, но проблема в другом ...
CancellationTokenSource cts;
protected async override void OnPreviewTextInput(TextCompositionEventArgs e)
{
if (txtName.IsFocused)
{
if (cts != null && !regex.IsMatch(e.Text))
{
cts.Cancel();
cts.Dispose();
}
cts = new CancellationTokenSource();
if (regex.IsMatch(e.Text))
{
e.Handled = true;
txtName.CaretIndex = txtName.Text.Length;
if (AlertPopup.IsOpen == false)
{
AlertPopup.IsOpen = true;
txtName.Focus();
try
{
await Task.Delay(5000, cts.Token);
}
catch (TaskCanceledException) { }
finally
{
AlertPopup.IsOpen = false;
}
}
}
else
{
AlertPopup.IsOpen = false;
}
base.OnPreviewTextInput(e);
}
}