Есть ли лучший способ постоянно записывать строки в консоль, одновременно проверяя ввод пользователя?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли лучший способ постоянно записывать строки в консоль, одновременно проверяя ввод пользователя?

Сообщение Anonymous »

Я программирую консольный скоростной сканер. У меня есть автоматический режим, в котором консоль печатает все слова — по одному — и показывает каждое слово в течение периода времени, установленного пользователем. При печати отдельных слов я хочу постоянно проверять ввод клавиш пользователем, не блокируя вывод на консоль.
Мой метод 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»