C# 有效地检查串行端口状态

C# 有效地检查串行端口状态,c#,serial-port,task,C#,Serial Port,Task,我使用的是SerialPort,需要对其状态做出反应(有自定义的端口数据读取指示器)。 我创造了这个结构: this.connectionWatcher = new Task(async () => { while (!this.cancelReceive.IsCancellationRequested) { if ((this.port == null || !this.port.IsOpen) && this.machineState.I

我使用的是
SerialPort
,需要对其状态做出反应(有自定义的端口数据读取指示器)。 我创造了这个结构:

this.connectionWatcher = new Task(async () =>
{
    while (!this.cancelReceive.IsCancellationRequested)
    {
        if ((this.port == null || !this.port.IsOpen) && this.machineState.IsConnected)
            this.machineState.IsConnected = false;
        if (this.port != null && this.port.IsOpen && !this.machineState.IsConnected)
            this.machineState.IsConnected = true;

        await Task.Delay(1000);
    }
}, this.cancelReceive.Token);
machineState.IsConnected
bool
属性,用于指示器

我有两个问题(两个问题可以同时解决,imho):

  • 当我关闭应用程序的主窗口时,此
    任务
    未停止
  • 如何更有效地执行此操作,因为
    while
    不是最佳实践,对CPU有很大影响

  • “…虽然不是最佳做法,但对CPU有很大影响…”-虽然不是最佳做法,但在您的情况下,由于您的
    任务,它不会对CPU有很大影响。延迟
    。现在,你是否应该做后者是一个全新的问题……除了我最后的评论之外,订阅
    PinChanged
    事件要比在
    Task.Delay()时循环使用
    来检测DSR和CTS的变化要优雅得多。不完全确定为什么只需要为
    IsOpen
    使用逻辑,这很简单。无需循环启动时,任务管理中CPU的负载增加连接COM端口是微不足道的。为什么你的CPU负载增加了?我不知道,我认为这是因为使用了while循环。