我用这个线程是为了设备通讯的,线程在执行过程中要从设备中读取数据,如果设备中没有数据发送,线程会等待外设发送数据,可是如果这时候网络突然断开,线程是不会知道网络断开,线程一直在等待外设发送数据,可是外设已经断开,根本不会发送数据过来,这样这个线程就停到这了 。问题一:我是这样解决的,我在外面做了一个定时器,定时去检查设备状态,如果设备连接不到,我就想要重新启动刚才那个线程,可是线程正在运行,如何重启?问题二:如果我可以重启了,线程对应的方法是从方法的开始部分执行,还是从接收等待接收外设数据那开始,我之所以这么想是因为线程重启之前肯定是执行到这里。问题三:与外设通讯是网络通讯,TCP ,ip的,我想去判断我所连接的外设是否连接,我用tcpclient1..Connected来获取状态,可是当我直接吧网线拔下的时候,他的状态还是true,只有当我在连接一次tcpClient1.Connect(ip, Port);,我这个判断状态是在定时器里做的,如果定时去连接这个ip,那样是不是会多连接了无数次,程序开的时间越长,所开的连接就会越多,这样会影响到通讯的性能吧?
各位大侠,谁有好的办法帮我解决一下,小弟分不多,帮帮忙:我用这个线程是为了设备通讯的,线程在执行过程中要从设备中读取数据,如果设备中没有数据发送,线程会等待外设发送数据,可是如果这时候网络突然断开,线程是不会知道网络断开,线程一直在等待外设发送数据,可是外设已经断开,根本不会发送数据过来,这样这个线程就停到这了 。问题一:我是这样解决的,我在外面做了一个定时器,定时去检查设备状态,如果设备连接不到,我就想要重新启动刚才那个线程,可是线程正在运行,如何重启?问题二:如果我可以重启了,线程对应的方法是从方法的开始部分执行,还是从接收等待接收外设数据那开始,我之所以这么想是因为线程重启之前肯定是执行到这里。问题三:与外设通讯是网络通讯,TCP ,ip的,我想去判断我所连接的外设是否连接,我用tcpclient1..Connected来获取状态,可是当我直接吧网线拔下的时候,他的状态还是true,只有当我在连接一次tcpClient1.Connect(ip, Port);,我这个判断状态是在定时器里做的,如果定时去连接这个ip,那样是不是会多连接了无数次,程序开的时间越长,所开的连接就会越多,这样会影响到通讯的性能吧?
各位大侠,谁有好的办法帮我解决一下,小弟分不多,帮
各位大侠,谁有好的办法帮我解决一下,小弟分不多,帮帮忙:我用这个线程是为了设备通讯的,线程在执行过程中要从设备中读取数据,如果设备中没有数据发送,线程会等待外设发送数据,可是如果这时候网络突然断开,线程是不会知道网络断开,线程一直在等待外设发送数据,可是外设已经断开,根本不会发送数据过来,这样这个线程就停到这了 。问题一:我是这样解决的,我在外面做了一个定时器,定时去检查设备状态,如果设备连接不到,我就想要重新启动刚才那个线程,可是线程正在运行,如何重启?问题二:如果我可以重启了,线程对应的方法是从方法的开始部分执行,还是从接收等待接收外设数据那开始,我之所以这么想是因为线程重启之前肯定是执行到这里。问题三:与外设通讯是网络通讯,TCP ,ip的,我想去判断我所连接的外设是否连接,我用tcpclient1..Connected来获取状态,可是当我直接吧网线拔下的时候,他的状态还是true,只有当我在连接一次tcpClient1.Connect(ip, Port);,我这个判断状态是在定时器里做的,如果定时去连接这个ip,那样是不是会多连接了无数次,程序开的时间越长,所开的连接就会越多,这样会影响到通讯的性能吧?
各位大侠,谁有好的办法帮我解决一下,小弟分不多,帮
解决方案 »
- DataGridView导出成EXCEL文挡(是Winform,不是Web)
- C#打洞过程
- Query+Json问题???
- 怎么给文本后边加上回车(换行符)
- Visual Studio 2005 下csc怎么用啊
- 如何获取远程站点上的某个图片的大小?
- 思归老大来看看,c#下如何检测客户端有没有安装adobe公司的热reader等pdf浏览器,搞不定就别做mvp了,给我50万分
- 安装项目自定义操作怎么才能单步执行或中断
- C#表单关闭控制如何处理?
- 如何使一个HyperLink成为一个普通文本
- 【奇怪】C# Winform问题很是郁闷
- 我的DataGridView和DataTalbe绑定为什么没有数据?(附代码)
如果非要重启线程,就先终止再启动下。
原因我想可能是因为网络断开了而tcpclient不知道,只有从新连接的时候他才能判断网络的状态,如果我每次timer执行的时候都无条件的去连接这个ip,这样会不会抛弃原来的连接,如果抛弃的话,那么原来的连接如果正在接受数据,那数据肯定会丢失.
我要从新连接的时候,一定是重新初始化线程,因为这个线程肯定是在接受数据的那个位置等待呢,如果我重新初始化线程,线程是从头开始执行还是从等待的接受数据的地方开始呢?
先谢谢各位的帮助,无论是有用的还是没用的,我都要谢谢各位,小弟分不多,所以多谢各位的帮助!
C、C++不行。
我的经验。
{
string ElectronIp = ReadWriteIni.ReadCarRegister("ElectronEquipment", "Electron1Ip");
string ElectronPort = ReadWriteIni.ReadCarRegister("ElectronEquipment", "Electron1Port");
if (!CheckNetwork(ElectronIp, int.Parse(ElectronPort)))
{
receiveData1 = new Thread(new ThreadStart(receiveDT1Data));//用来接收读头数据的线程
receiveData1.IsBackground = true;
receiveData1.Start();
}
}
private bool CheckNetwork(string hostName, int portNum)
{
try
{
TcpClient client = new TcpClient(hostName, portNum);//如果能建立TCP连接,表示端口打开,否则,抛出异常
client.Close();
return true;
}
catch
{
return false;
}
} private void timer1_Tick(object sender, EventArgs e)
{
string ElectronIp = ReadWriteIni.ReadCarRegister("ElectronEquipment", "Electron1Ip");
string ElectronPort = ReadWriteIni.ReadCarRegister("ElectronEquipment", "Electron1Port");
if (!CheckNetwork(ElectronIp, int.Parse(ElectronPort)))
{
receiveData1 = new Thread(new ThreadStart(receiveDT1Data));//用来接收读头数据的线程
receiveData1.IsBackground = true;
receiveData1.Start();
}
}
private bool CheckNetwork(string hostName, int portNum)
{
try
{
TcpClient client = new TcpClient(hostName, portNum);//如果能建立TCP连接,表示端口打开,否则,抛出异常
client.Close();
return true;
}
catch
{
return false;
}
}
这样的时候,网络网线拔掉以后,他会显示自动断开了,我插上的时候,他也会自动连接,可是刚连接不一会就会自动断开了,在等一会,会出错,说线程已经启动,无法再次启动
public void receiveDT1Data()//接受数据
{ string ElectronIp = ReadWriteIni.ReadCarRegister("ElectronEquipment", "Electron1Ip");
string ElectronPort = ReadWriteIni.ReadCarRegister("ElectronEquipment", "Electron1Port"); try
{
tcpClientDT1 = new TcpClient();
tcpClientDT1.Connect(ElectronIp, int.Parse(ElectronPort));
SetLabelText22("已连接");
SetLabel22Color(System.Drawing.Color.Chartreuse);
while (true)
{
ns1Data = tcpClientDT1.GetStream();
stream1Reader = new StreamReader(ns1Data);
string tag = stream1Reader.ReadLine();
//这里是关于tag的处理
}
}
catch(Exception ex)
{
//MessageBox.Show(ex.Message);
//dt1Connection();
SetLabelText22("连接异常");
SetLabel22Color(System.Drawing.Color.Red); Thread.Sleep(3000);//线程休眠,否则会引起方法的不执行,原因未知,主要导致读头不工作,连接成功,但不读取信息
receiveData1 = new Thread(new ThreadStart(receiveDT1Data));
receiveData1.IsBackground = true;
receiveData1.Start();
}
}
这个方法是现成执行的方法,大家帮我分析下,看有什么问题
stream1Reader = new StreamReader(ns1Data);
string tag = stream1Reader.ReadLine();
线程在读取端口的时候,如果没数据的话,他会停在这,这时候如果网络断开了,是不会抛出异常的,他就在那傻等
.我做的也是就一个开了一个线程.其实网络已经被我手动断开了,可是他不知道,异常不会抛出,所以这时候,我就想用一个timer 定时去判断网络是否断开了
问题二:新开一个线程,肯定是从开始部分执行啦。
问题三:你只要定时Send一个检测字符过去就可以了,或者让客户端定时给你发送一个检测字符,FTP就是那样做的,由于FTP的控制命令连接是单独一个端口,所以客户端发送检测字符不会影响数据的接收。
TCP 协议是双向的, 读与写并不冲突。即使线程被阻塞在 string tag = stream1Reader.ReadLine(); 处, 你也可以再另外的线程中用同一个 TCPClient 发送数据啊, 不需要再开一个连接。定时发送检测用的空数据包就可以检测网络状况,要是发送出现异常了,直接就可以把 TCPClient 关掉重开。由于发送与接受是同一个 TCPClient, 代码还简单一些如果你有空去看看 MSDN 里面关于 Socket.send 与 Socket.Receive 的解释与例子,相信你的思路会清晰很多。(个人觉得 TCPClient 封装得太过漂亮了)
也谢谢你的建议,我一会去看下msdn