Я изучаю обмен сообщениями через сокет.Я прервал Console.ReadKey () в цикле while, и многие вызовы оказались неполными.Я пытаюсь найти способ удалить незавершенные вызовы без того, чтобы пользователь все это печатал.
Я видел
while(Console.KeyAvailable){Console.ReadKey(true);}
, но у меня возникла противоположная проблема: слишком много вызовов не достаточно Ключштрихи.
Как добавить Timeout в Console.ReadLine ()? Этот вопрос помог мне понять, где я сейчас нахожусь, но это не решает мою текущую проблему.
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
DontLockOnCharGet bug = new DontLockOnCharGet();
bug.Setup();
}
}
public class DontLockOnCharGet
{
public void Setup()
{
while (true) { DontLockCharGet(); }
}
public void DontLockCharGet()
{
while (true)
{
// used to interrupt the Console.ReadKey() function
AutoResetEvent getInput = new AutoResetEvent(false);
AutoResetEvent gotInput = new AutoResetEvent(false);
// Console.ReadKey() assigns to input
char input = ' ';
//Lambda used to get rid of extra class
Thread tom = new Thread(() =>
{
getInput.WaitOne(); // Waits for getInput.Set()
//The problem with this is the read keys stacking up
// causing the need for a lot of keystrokes
input = Console.ReadKey().KeyChar;
gotInput.Set();
})
{
IsBackground = true
};
// Starts Lambda function
tom.Start();
// Allows thread to pass WaitOne() in Lambda
getInput.Set();
// Gives some milliseconds for before stopping Lambda exe
gotInput.WaitOne(2000);
if (input == 'S' || input == 's')
{
break;
}
// thinking I would put the solution here
//...
}
//Do stuff if input is s || S
Console.Write("end: ");
}
}
Я ожидаю, что смогу нажать 's' ||'S' и затем напечатайте сообщение, но в зависимости от того, как долго я ждал, мне, возможно, придется долго удерживать 's'.
Решение, с которым я столкнулся из-за первого комментария.
using System;
using System.Threading;
/// <summary>
/// Problem fixed I don't know why
/// Probably not making a new function for each call
/// </summary>
class Program
{
static void Main(string[] args)
{
DontLockOnCharGet bug = new DontLockOnCharGet();
bug.Setup();
}
}
public class DontLockOnCharGet
{
public void Setup()
{
while (true) { DontLockCharGet(); }
}
public void DontLockCharGet()
{
while (true)
{
//Specifies time to wait for input
char i = Reader.ReadKey(1000);
if (i == 's' || i == 'S')
{
//Do stuff if input is s || S
break;
}
Console.Write(i);
}
// Do stuff
Console.Write("end: ");
}
}
class Reader
{
private static Thread inputThread;
private static AutoResetEvent getInput, gotInput;
private static char input;
static Reader()
{
//Setup once
getInput = new AutoResetEvent(false);
gotInput = new AutoResetEvent(false);
//inputThread = new Thread(reader);
//inputThread.IsBackground = true;
//inputThread.Start();
}
private static void reader()
{
//waits for .Set()
getInput.WaitOne();
input = '\0';
input = Console.ReadKey().KeyChar;
//Marks if input is gotten
gotInput.Set();
}
// omit the parameter to read a line without a timeout
public static char ReadKey(int timeOutMillisecs = Timeout.Infinite)
{
//Setup and start read thread
inputThread = new Thread(reader)
{
IsBackground = true
};
inputThread.Start();
//Allows thread to continue in reader()
getInput.Set();
//Wait for input or back out befor it is given
bool success = gotInput.WaitOne(timeOutMillisecs);
return input;
}
}
Эта версия кода работает, как и ожидалось: введите 'S' и она автоматически завершается до "Отправить:"