2、AutoResetEvent,Semaphore 或别的什么,哪个更合适?
3、在多个客户端下,收发一一对应,如果是多个客户端的情况,如下在发的线程中实例化信号量,收线程如何找到对应的信号量并给发线程信号?
我对多线程及同步都是刚刚接触,望大侠给予帮助,不胜感激!
公共数据
private string ssss; //收线程收到的数据
private Boolean bWaitMark; //信号量消息的标识
static Semaphore sem; //程序中用的是它
private AutoResetEvent autoResetEvent; //程序中已注释
发送线程执行部分
//发送线程执行的内容
private void sendthread()
{
//autoResetEvent = new AutoResetEvent(false);
//创建一个可授权1个许可证的信号量,且初始值为0
sem = new Semaphore(0, 1);
//.......
//发送指令
//.......
bWaitMark = true;
//if (autoResetEvent.WaitOne(200, false))
if (sem.WaitOne(200, true)) // 等待接收线程消息 200毫秒超时时间
{
//校验应答数据 ssss
}
else
{
//超时记录
}
sem.Close();
}
接收线程执行部分
//接收线程执行的内容
void RecMsg(object sokConnectionparn)
{
Socket sokClient = sokConnectionparn as Socket;
while (true)
{
//接收数据 赋予 ssss
if (bWaitMark)
{
//autoResetEvent.Set();
sem.Release();
bWaitMark = false;
}
}
}
10 个解决方案
#1
#2
大侠都在哪里啊……………………………………………………………………
#3
#4
不会吧……
#5
带上封包的时间吧 然后那边根据延时判断信号强弱
当然是心跳包带 别的包带 误差太大。。。
当然是心跳包带 别的包带 误差太大。。。
#6
可能我上面的代码并不完全,您有所误解。也可能是我提问有点不够清楚,刚接触C#对您的回复,也不太理解。
我通讯是用Socket来实现的,一个客户端与服务器连接,在服务器端产生一个客户连接对象,针对这个对象的通讯,两个线程,一收一发。收是不可控的,只要有连接对象,收就一直存在,并实时接收客户端发来的数据,发是服务器发起,发送完毕结束发送线程。这两个线程的同步,我使用了信号量。如上代码所示,单一的客户端,我可以通过公共声明信号量来实现收发线程都认识这个信号量,但是如果是多个客户端,有多对收发线程。
那收发线程中的多个信号量,怎么来确认?或者说有什么方式能让一对收发线程找到自己同步的那个信号量?
e.g:
A客户端 A收线程 A发线程 A信号量
B客户端 B收线程 B发线程 B信号量
在A发线程实例化后的A信号量,怎么让A收线程知道?并且给A发线程信号,而不是给B发线程信号?
#7
单位电脑太悲催了,引用都出不来,疯了!
#8
都不清楚啊?
#9
不是很清楚,个人认为如果想区分不同线程中的东东。
建议可以用字典试试,以地址为key。
建议可以用字典试试,以地址为key。
#10
FlyBird 谢谢你的建议,可以试试!
#1
#2
大侠都在哪里啊……………………………………………………………………
#3
#4
不会吧……
#5
带上封包的时间吧 然后那边根据延时判断信号强弱
当然是心跳包带 别的包带 误差太大。。。
当然是心跳包带 别的包带 误差太大。。。
#6
可能我上面的代码并不完全,您有所误解。也可能是我提问有点不够清楚,刚接触C#对您的回复,也不太理解。
我通讯是用Socket来实现的,一个客户端与服务器连接,在服务器端产生一个客户连接对象,针对这个对象的通讯,两个线程,一收一发。收是不可控的,只要有连接对象,收就一直存在,并实时接收客户端发来的数据,发是服务器发起,发送完毕结束发送线程。这两个线程的同步,我使用了信号量。如上代码所示,单一的客户端,我可以通过公共声明信号量来实现收发线程都认识这个信号量,但是如果是多个客户端,有多对收发线程。
那收发线程中的多个信号量,怎么来确认?或者说有什么方式能让一对收发线程找到自己同步的那个信号量?
e.g:
A客户端 A收线程 A发线程 A信号量
B客户端 B收线程 B发线程 B信号量
在A发线程实例化后的A信号量,怎么让A收线程知道?并且给A发线程信号,而不是给B发线程信号?
#7
单位电脑太悲催了,引用都出不来,疯了!
#8
都不清楚啊?
#9
不是很清楚,个人认为如果想区分不同线程中的东东。
建议可以用字典试试,以地址为key。
建议可以用字典试试,以地址为key。
#10
FlyBird 谢谢你的建议,可以试试!