C sharp - Romper bucle con tecla Enter

 
Vista:
Imágen de perfil de Luis Alfredo
Val: 2
Ha aumentado su posición en 4 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Romper bucle con tecla Enter

Publicado por Luis Alfredo (1 intervención) el 28/06/2018 22:04:22
Saludos

Quiero pedir ayuda con esto: quiero hacer un bucle que se repita hasta que se presione la tecla ENTER

Tengo un código como este:

1
2
3
4
5
6
7
8
9
10
11
12
static void Instrucciones_de_bucle()
{
    while (Console.ReadKey(true).Key != ConsoleKey.Enter)
    {
        Console.WriteLine("Algún texto");
    }
}
 
static void Main(string[] args)
{
    Instrucciones_de_bucle();
}

Es un código de ejemplo

Lo he intentado de muchas maneras pero siempre existe el mismo error: cualquier método de leer la tecla ingresada pausa el programa hasta que se presiona ENTER

Es en aplicación de consola

Si no existe ninguna manera lo agradecería de todas formas :s
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Romper bucle con tecla Enter

Publicado por William Alexander Brito Vinas (1 intervención) el 11/07/2018 15:22:27
El bucle no puede correr en el mismo hilo que el que espera la tecla para saber si terminar o no.
La tecla enter lo que hace es mandar una CancellationRequest que debe ser manejada dentro del codigo del hilo.

Aqui te dejo un ejemplo para que puedas modificar a gusto que muestra una linea y espera por una tecla de cancelacion, en mi caso 'C'.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
static void Main(string[] args) {
    const int FREQ = 200;
    const char CANCEL_CHAR = 'c';
 
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    Console.WriteLine("Press {0} to cancel the task", char.ToUpper(CANCEL_CHAR));
 
    Task.Factory.StartNew(() => {
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        string helix = @"\|/-|/-\";
        int offset = 0;
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.Write("\nLong running task: ");
        Console.ForegroundColor = ConsoleColor.Yellow;
        int posX = Console.CursorLeft;
        int posY = Console.CursorTop;
 
        while(true) {
            Console.Write(helix[offset]);
            offset = (offset + 1) % helix.Length;
            Console.SetCursorPosition(posX, posY);
            Thread.Sleep(FREQ);
 
            if (tokenSource.Token.IsCancellationRequested) {
                stopwatch.Stop();
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("\nTask ran for {0} seconds before being cancelled by the user.", stopwatch.Elapsed.TotalSeconds);
                Console.ResetColor();
                break;
            }
        }
    }, tokenSource.Token)
    .ContinueWith(t => {
        Console.Write("\nPress any key to close");
    });
 
 
    do {
        ConsoleKeyInfo pressedKey = Console.ReadKey(intercept: true);
        if (char.ToLower(pressedKey.KeyChar) == char.ToLower(CANCEL_CHAR)) {
            tokenSource.Cancel();
            break;
        }
    } while (true);
    Console.ReadKey(intercept: true);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar