나는 SerialPort의 read 메소드를 기다릴 수있는 작업으로 래핑하려고합니다. 그러면 CancellationToken과 SerialPort 객체의 타임 아웃을 사용할 때 얻을 수있는 이점을 얻을 수 있습니다. 내 문제는 내가 CancellationException을 던질 수있는 작업을 얻을 수없는 것입니다. 여기 내 코드가 ...CancellationToken 및 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);
}
}
Port.Read 메서드가 블로킹 호출이기 때문에 그렇습니까? 어떤 제안?