关闭serialport在另一个线程中打开

rkdobh.

新成员
加入
2019年10月8日
消息
2
编程经验
Beginner
你好呀。
我有一个程序,它创建一个线程,它打开一个serialport(假设com1)。在我的程序的某个时刻,我必须杀死此线程(Thread.Abort)但是当我这样做时,Com1打开和不可用的开放式串口端口。
如何关闭任何打开的串口,即我的程序的某些线程已打开?

谢谢
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
You should avoid calling Thread.Abort if you possibly can but, if you're going to call it, you should have read the documentation for that method. As the documentation states, it throws a ThreadAbortException. That means that you can add appropriate exception handling and then cleanup in either the Catch or Finally blocks, depending on whether it needs to be done only on abort or in all cases.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
这是背景工人,并且在像你这样的情况下,实现一个人真的很方便。您的runworkerasync()将在一个新的线程中运行,并执行您希望完成的长时间运行过程。当工作者切换到RunWorkerCompleted()时,您将重新返回您的主线程,您可以在那里关闭不再工作的端口。 RunWorkerCompleted()方法在主线程中运行。在Dowork方法完成循环后,它会自动完成此操作。进一步澄清,如果在UI线程上创建了背景工作台,则当工作人员完成工作时,runworker复合程序将在UI线程上提出,如果您在新线程中创建工作者,则会返回任意线程,所以尽量避免这种情况。看 Backgroundworker类(System.ComponentModel) 你也可以从中拿起一些提示 serialport类(system.io.ports) 重新re如何在文档中使用Threading Par示例。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,904
地点
切萨皮克,va.
编程经验
10+
OP:您是否中止了线程,因为从港口读取正在陷入困境,如果在文档中链接到上面的眉毛,所以它说:
If a 串行端口 对象在读取操作期间被阻止,不中止线程。相反,关闭基本流或处置 串行端口 object.
 

rkdobh.

新成员
加入
2019年10月8日
消息
2
编程经验
Beginner
这是背景工人,并且在像你这样的情况下,实现一个人真的很方便。您的runworkerasync()将在一个新的线程中运行,并执行您希望完成的长时间运行过程。当工作者切换到RunWorkerCompleted()时,您将重新返回您的主线程,您可以在那里关闭不再工作的端口。 RunWorkerCompleted()方法在主线程中运行。在Dowork方法完成循环后,它会自动完成此操作。进一步澄清,如果在UI线程上创建了背景工作台,则当工作人员完成工作时,runworker复合程序将在UI线程上提出,如果您在新线程中创建工作者,则会返回任意线程,所以尽量避免这种情况。看 Backgroundworker类(System.ComponentModel) 你也可以从中拿起一些提示 serialport类(system.io.ports) 重新re如何在文档中使用Threading Par示例。
谢谢,我会读到它。在我的情况下,我必须能够消除正在进行的进程,因此关闭了串行物品。我会尝试背景工人。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
注意BackgroundWorker.CancellationPending正是如此,而在您的Dowork正在运行时,您偶尔检查取消是否待定,如果是,则删除工作。我链接的文档拥有此主题的所有信息,因此需要花时间阅读它们。当然,如果你被困或需要解释的东西,请告诉我们。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
注意BackgroundWorker.CancellationPending正是如此,而在您的Dowork正在运行时,您偶尔检查取消是否待定,如果是,则删除工作。我链接的文档拥有此主题的所有信息,因此需要花时间阅读它们。当然,如果你被困或需要解释的东西,请告诉我们。
不确定,但我猜这是不可能的,因为SerialPort可能是一个阻塞呼叫。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,904
地点
切萨皮克,va.
编程经验
10+
什么 jmcilhinney is trying to say is that there is no way to check (within the same worker thread/thread pool thread) while you are blocked. Given the following code how can you get back to the while condition if serialPort.Read() is blocked:
C#:
while (!worker.CancellationPending)    // initially not cancelled, so go to read below
{
    :
    serialPort.Read(...);    // while blocked here, the worker.CancelAync() has been called on the UI thread.
    :
}
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
我骨管,所以让我快速澄清,因为我被推动了,因为你发布的上面的代码不是我正在考虑的......(我猜;我的错,因为没有详细阐述。)

......而上面的代码示例你发布了一个有效的例子,你认为我的意思是,是的,关于剪辑是正确的。但是,仍然可以使用单独的线程检查,实现失败保险箱,以调查背景工作器,并检查循环是否仍然报告执行,因为我刚刚做到了。

在一个 非连续运动标准案例,您可以声明私有int作为循环的股票代码,或者只是使用停止手表,而循环读/写作,并且私有int不超过给定的时间框架内的最后一个值,这将表示工人可以被执行代码阻止。在SerialPorts的情况下,到目前为止,这种私人int将是读/写的。您应该检查字节阅读/写入... serialport.bytestoread属性(system.io.ports)

io.ports也有超时 serialport.readTimeout属性(System.Io.ports) 应该使用它。坦率地说,如果用户是读/写的东西,它应该知道它需要多长时间,如果超过超时,则可以简单地处理它,如果您用文档提供的其他途径耗尽,如检查握手,超时,字节到目前为止书面/阅读等等。这也值得一读:一些SerialPort提示 前五名SerialPort提示[Kim Hamilton] 由于我们的OP没有发布代码,因此我们没有任何比较。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,904
地点
切萨皮克,va.
编程经验
10+
是的,利用超时以及数据可用事件。
 
最佳 底部