C # espera evento y tiempo de espera en comunicación de puerto serie

Hola, tengo una comunicación simple en el puerto serie, todo está de acuerdo con el libro y la documentación, así que el método de puerto abierto se ve así:

    public SerialPort OpenPort(string portName)
    {
        Port = new SerialPort(portName, BaudRate);
        try
        {
            Port.Open();
            Port.DtrEnable = true;
            Port.RtsEnable = true;

            Port.DataReceived += DataReceivedEvent;
        }
        catch (Exception e)
        {
            Console.WriteLine($"ERRROR: {e.Message}");
        }

        return Port;
    }

Aquí tenemos un evento sobre datos leídos:

    private async void DataReceivedEvent(object sender, SerialDataReceivedEventArgs e)
    {
        var data = new byte[Port.BytesToRead];
        await Port.BaseStream.ReadAsync(data, 0, data.Length);

        Response = data;

        isFinished = true;
    }

Bueno, todo está bien, pero ahora quiero enviar un mensaje a pedido y almacenar la respuesta en una propiedad, también quiero agregar un token de cancelación en el tiempo de espera de esa tarea. Entonces se me ocurrió este método:

        public async Task SendMessenge(byte[] messange)
    {
        var cancellationTokenSource = new CancellationTokenSource();
        CancellationToken token = cancellationTokenSource.Token;
        cancellationTokenSource.CancelAfter(5000);
        token.ThrowIfCancellationRequested();

        isFinished = false;
        try
        {
            Task worker = Task.Run(() =>
            {
                while (!isFinished)
                {
                }
            }, token);

            await Port.BaseStream.WriteAsync(messange, 0, messange.Length, token);
            await worker;
        }
        catch (OperationCanceledException e)
        {
            throw new OperationCanceledException(e.Message, e, token);
        }
    }

Problem es con este ciclo while, si es una tarea, entra en un ciclo sin fin, y no captura el token de tiempo de espera, si lo pongo fuera de una tarea y elimino al trabajador, funciona pero estoy perdiendo el token de cancelación. Supongo que podría hacer una cuenta regresiva manual como:

double WaitTimeout = Timeout + DateAndTime.Now.TimeOfDay.TotalMilliseconds;
while (!(DateAndTime.Now.TimeOfDay.TotalMilliseconds >= WaitTimeout)|| !isFalse) 

Pero se ve feo.

¿Entonces creo que mi pregunta básica es cómo esperar con eficacia el evento para responder y obtener un tiempo de espera?

Respuestas a la pregunta(1)

Su respuesta a la pregunta