Ich versuche, die Lesemethode des SerialPort in eine Aufgabe zu packen, die erwartet werden kann, auf diese Weise kann ich die Vorteile der Verwendung eines CancellationToken und des Timeout vom SerialPort-Objekt erhalten. Mein Problem ist, dass ich die Aufgabe nicht dazu bringen kann, eine Abbruch-Ausnahme auszulösen. Hier ist mein Code ...Async Serial Port mit CancellationToken und ReadTimeout
static CancellationTokenSource Source = new CancellationTokenSource();
static void Main(string[] args)
{
TestAsyncWrapperToken();
Console.WriteLine("Press any key to cancel");
Console.ReadKey(true);
Source.Cancel();
Console.WriteLine("Source.Cancel called");
Console.ReadLine();
}
static async void TestAsyncWrapperToken()
{
try
{
using (var Port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One))
{
Port.Open();
var Buffer = new byte[1];
await Task.Factory.StartNew(() =>
{
Console.WriteLine("Starting Read");
Port.ReadTimeout = 5000;
Port.Read(Buffer, 0, Buffer.Length);
}, Source.Token);
}
}
catch (TaskCanceledException)
{
Console.WriteLine("Task Cancelled");
}
catch (TimeoutException)
{
Console.WriteLine("Timeout on Port");
}
catch (Exception Exc)
{
Console.WriteLine("Exception encountered {0}", Exc);
}
}
Ist es, weil die Port.Read-Methode ein blockierender Anruf ist? Irgendwelche Vorschläge?