Как сделать приоритет Console.Readline?
Как сделать чтобы можно было писать команды в консоль в любой момент времени? Например при выполнении Thread.Sleep(1000); я в консоль не могу написать команду, пока он не отработает. Нужно сделать чтобы ввод в консоль был с высоким приоритетом (работал поверх всего).
IsWorking = true;
while (IsWorking)
{
message = Console.ReadLine();
if (message == Hello.FirstOrDefault(s => s == message))
{
Console.WriteLine(Answer(0));
Thread.Sleep(1000); //(это пример потраченного времени. Здесь мог бы находиться массив или что-то еще) на этом этапе ввод в консоль будет недоступен, а нужно чтобы в консоль можно было писать команды.
else if (message == "Пока" || message == "До свидания")
{
Console.WriteLine(Answer(1));
IsWorking = false;
}
else
Console.WriteLine(Answer(3));
}
Ответы (2 шт):
Автор решения: Exllated
→ Ссылка
Thread t = new Thread(new ThreadStart(SomeOperation));
t.Start();
Где SomeOperation название метода который нужно вызвать
Введение в многопоточность. Класс Thread
Автор решения: Bulson
→ Ссылка
static void Main(string[] args)
{
var menu = new Menu(Console.WriteLine, Console.ReadLine);
while (menu.ShowCommands())
{
menu.ExecuteCommand();
}
}
class Menu
{
private readonly Action<string> _output;
private readonly Func<string> _input;
private readonly Dictionary<string, Action> _options;
private Action _currentOption;
private bool _isDone;
public Menu(Action<string> output, Func<string> input)
{
_output = output;
_input = input;
_options = new Dictionary<string, Action>
{
["_"] = () => InputError(),
["Пока"] = () => Exit(),
["Делай дело"] = () => DoWork()
};
}
private void InputError()
{
_output("Неверная команда. Повторите ввод.");
_output(string.Empty);
}
private void DoWork()
{
_output("Начинаю вычислять...");
Task.Run(async () =>
{
//что-то вычисляем здесь...
await Task.Delay(3000);
});
}
private void Exit()
{
_isDone = true;
_output(string.Empty);
_output("Выходим...");
_output("Нажмите ввод");
_input();
}
internal bool ShowCommands()
{
if (_isDone)
{
return false;
}
_output("Доступные команды:");
var index = 0;
foreach (var key in _options.Keys)
{
if (key.Equals("_"))
continue;
_output($"{++index}. {key}");
}
_output("Введите команду:");
var input = _input();
var optKey = _options.Keys.SingleOrDefault(k => k.StartsWith(input));
if (optKey is null)
{
optKey = "_";
}
_currentOption = _options[optKey];
return true;
}
internal void ExecuteCommand()
{
_currentOption();
}
}