Мой метод AutomaticallyReadWordsAsync печатает эти слова асинхронно, но я не нашел способа проверить асинхронное нажатие клавиши. Лучшее решение, которое я придумал, — это вызвать метод AutomaticallyReadWordsAsync и не ждать его результатов, а затем вызвать метод IsSpacebarPressed, который приводит к тому, что первый метод работает асинхронно в фоновом режиме, в то время как второй — синхронный — метод постоянно проверяет ввод пользователя или его отмену. После метода IsSpacebarPressed я ожидаю выполнения задачи от АвтоматическиReadWordsAsync. Если один из методов завершается, он отменяет CancellationTokenSource, что приводит к завершению другого метода, поскольку он проверяет состояние токена.
Вот упрощенная версия кода моего проекта для описания этой проблемы:
Код: Выделить всё
// See https://aka.ms/new-console-template for more information
var cancellationTokenSource = new CancellationTokenSource();
var automaticallyReadWordsTask = AutomaticallyReadWordsAsync(500, ["Hi", "I", "have", "a", "problem", "please", "help", "me."], cancellationTokenSource);
IsSpacebarPressed(cancellationTokenSource);
await automaticallyReadWordsTask;
async Task AutomaticallyReadWordsAsync(int millisecondsPerWord, string[] words, CancellationTokenSource cancellationTokenSource)
{
CancellationToken cancellationToken = cancellationTokenSource.Token;
int index = 0;
while (index >= 0 && index < words.Length && !cancellationToken.IsCancellationRequested)
{
Console.Clear();
Console.WriteLine(words[index++]);
await Task.Delay(millisecondsPerWord);
}
if (cancellationToken.IsCancellationRequested)
return;
cancellationTokenSource.Cancel();
return;
}
void IsSpacebarPressed(CancellationTokenSource cancellationTokenSource)
{
CancellationToken cancellationToken = cancellationTokenSource.Token;
ConsoleKeyInfo keyPressed;
while (!cancellationToken.IsCancellationRequested)
{
if (Console.KeyAvailable && !cancellationToken.IsCancellationRequested)
{
keyPressed = Console.ReadKey();
if (keyPressed.Key == ConsoleKey.Spacebar)
{
cancellationTokenSource.Cancel();
return;
}
}
}
return;
}
Я всегда мог бы включить бесполезные асинхронные методы в метод IsSpacebarPressed, но я считаю, что это хуже, чем то, как я делаю это сейчас.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ecking-for
Мобильная версия