Я использую последовательный порт в 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);