Async / Await mono crash - PullRequest
       10

Async / Await mono crash

0 голосов
/ 31 августа 2018

Я использую последовательный порт в MONO и Linux с шаблоном async / await в базовом потоке последовательного порта. Все работает нормально, поскольку порт существует. Это асинхронный поток, который я использую:

    private async Task ReceiverThreadRun(CancellationToken cancellationToken)
    {
        int readBytes;
        try
        {
            while (!cancellationToken.IsCancellationRequested)
            {
                readBytes = await this.stream.ReadAsync(this.receivingBuffer, this.receivingBufferIndex + this.receivingBufferCount,
                    receivingBufferSize - this.receivingBufferIndex - this.receivingBufferCount, cancellationToken).ConfigureAwait(false);

                if (readBytes > 0)
                {
                    ///do something
                }
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine("Receiving serial error:  {0}", exception.Message);
            CommonHelper.Logger.Error("Receiving serial error:  {0}", exception.Message);
        }

        CommonHelper.Logger.ConditionalDebug("Exiting  ReceiverThreadRun");
    }

Когда я отсоединяю последовательный USB-модуль, все зависает: приложение зависает, Linux зависает, возможно моно сбой. Единственное решение - перезагрузить машину.

Как можно управлять исчезновением портов с помощью шаблона асинхронного / ожидающего?

Забыл сказать, что Task ReceiverThreadRun запускается следующим образом:

Task.Factory.StartNew(() => ReceiverThreadRun(_cancellationTokenSource.Token), _cancellationTokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default).ConfigureAwait(false);
...