c#语言中定时控件与定时类有何异同?
1个回答
关注
展开全部
在.NET中有三种计时器:
1、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器。Timer控件和它所在的Form属于同一个线程;
2、System.Timers命名空间下的Timer类。System.Timers.Timer类:定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时。AutoReset属性设置是否重复计时(设置为false只执行一次,设置为true可以多次执行)。Elapsed事件绑定相当于另开了一个线程,也就是说在Elapsed绑定的事件里不能访问其它线程里的控件(需要定义委托,通过Invoke调用委托访问其它线程里面的控件)。
3、System.Threading.Timer类。定义该类时,通过构造函数进行初始化。
在上面所述的三种计时器中,第一种计时器和它所在的Form处于同一个线程,因此执行的效率不高;而第二种和第三种计时器执行的方法都是新开一个线程,所以执行效率比第一种计时器要好,因此在选择计时器时,建议使用第二种和第三种。
多线程计时器比较强大,精确,而且可扩展性强;
咨询记录 · 回答于2021-09-02
c#语言中定时控件与定时类有何异同?
在.NET中有三种计时器:1、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器。Timer控件和它所在的Form属于同一个线程;2、System.Timers命名空间下的Timer类。System.Timers.Timer类:定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时。AutoReset属性设置是否重复计时(设置为false只执行一次,设置为true可以多次执行)。Elapsed事件绑定相当于另开了一个线程,也就是说在Elapsed绑定的事件里不能访问其它线程里的控件(需要定义委托,通过Invoke调用委托访问其它线程里面的控件)。3、System.Threading.Timer类。定义该类时,通过构造函数进行初始化。在上面所述的三种计时器中,第一种计时器和它所在的Form处于同一个线程,因此执行的效率不高;而第二种和第三种计时器执行的方法都是新开一个线程,所以执行效率比第一种计时器要好,因此在选择计时器时,建议使用第二种和第三种。多线程计时器比较强大,精确,而且可扩展性强;
用C#这样恢复串口服务器掉线的问题?
是的
我有个这样的问题:用C#语言怎样恢复串口服务器掉线的问题,也就是通信过程中掉线了,应该用什么代码来及时恢复?
稍等一下我 查询一下
好的,谢谢!
另外,你的回答我怎么保存啊?好像复制不了啊?
C#串口通信的一般实现方法及潜存的问题 串口有两种读取方式,一种是同步的,另外一种就是基于事件的异步读取方式。因为同步接收会阻塞线程所以在大数据量通信时常采用异步方法读取。 在通信之前要对串口对象做一个初始化,这包括设置PortName(串口号)、BaudRate(波特率)、Parity(奇偶校验)、DataBits(数据位数)等,在此就不赘述了。 由于SerialPort类的封装,屏蔽了很多通信细节。所以异步串口通信的实现逻辑很简单。我们只须要为SerialProt类的DataReceived事件绑定一个处理函数,然后就可以在该函数中实现对串口数据的读取。假设该函数名为GetStrFromPort,其实现示例如下。 Public void GetStrFromPort( object sender, SerialDataReceivedEventArgs e ) { string str = null; str = serialprot.ReadTo( "\n\r" ); //读到该帧数据结束处 serialport.DiscardInBuffer(); //清除缓存中的内容DealWithProtStr( str ); //处理接收到的数据 } - 1 - 大多串口程序都会采用这种思路来实现串口通信。即先接收数据,然后处理数据,并在完成数据处理后,再次等待接收新数据。但这种实现方法在串口高速率大信息量通信时,会出现丢失数据的情况。 数据丢失的原因在于数据接收与数据处理同在一个线程中,如果数据处理时间较长,来不及接收的数据只能暂存于缓存中。一旦缓存满了,新到的数据就会冲刷掉未来的及接收的数据,从而造成数据的丢失。此时如果只单单增加缓存的容量是不能根本解决问题的。这也是我们在实际应用中遇到的问题。 3. 丢失数据问题的解决办法 有鉴于此,我们解决问题的思路就是将数据接收与数据处理分离开来,使数据接收得到最快的时间响应。通过在实际中的反复实验,我们最终采用了多线程加数据池来解决此问题。 设计思路如下:数据接收与数据处理分别在两个线程中进行,数据接收线程负责数据接收并将接收的数据存入数据池中;数据处理线程负责从数据池中读取数据和处理数据。
不好意思我也不知道为什么复制不了呢
麻烦您帮忙给给赞吧感谢
你这个回答不是我提的问题,我问的是串口服务器,是网络通信,不是串口通信。
是串口服务器恢复对吧
是通信过程中掉线的自动恢复问题,用C#语言。
server = ip.Text; Port =Convert.ToInt32( this.port.Text); tcpclient = new TcpClient(server, Port); // 启用keep-alive tcpclient.Client.IOControl(IOControlCode.KeepAliveValues, GetKeepAliveData(), null); tcpclient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); // Translate the passed message into ASCII and store it as a Byte array. Byte[] data = System.Text.Encoding.UTF8.GetBytes("连接开始 发送第一个数据"); // Get a client stream for reading and writing. // Stream stream = client.GetStream(); NetworkStream stream = tcpclient.GetStream(); // Send the message to the connected TcpServer. stream.Write(data, 0, data.Length); private byte[] GetKeepAliveData() { uint dummy = 0; byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
这样的代码