如题:
因为项目需要,使用socket通信。客户端。
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecievedComplete), new Info(){Socket=client,Buffer=buffer});
回应方法:
private static void RecievedComplete(IAsyncResult ar)
{
Info inf= ar.AsyncState as Info;
Socket sk = inf.Socket;
int recieved;
try
{
recieved = sk.EndReceive(ar);
if (recieved > 0)
{
sk.BeginReceive(inf.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(RecievedComplete), Info);
////////////////////我想把inf.Buffer 回应的数据,返回。
}
else {
receiveDone.Set();
}
}
比如在 socket回应后,执行 Update()方法。update方法需要使用回应的数据。socket方法我学的公用的。根据返回结果执行不同操作的。
你有一个 Info 对象,其中有 Socket 还有一个 Buffer
—— 你接收到数据之后:inf.Buffer 也就已经赋值了。
发送线程:发送数据,线程等待。 从Buffer中取值,执行 后续操作。
接收线程: 接收数据,赋值Buffer,
——————————————————————————
关键问题是: 如何让 发送线程 等待。
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecievedComplete), new Info(){Socket=client,Buffer=buffer});
这行代码之后,两个方案:
> Thread.Sleep(10000); //让 发送线程等待 10秒。
> 线程同步锁 —— 这个 理解有点难度(你先用 第一种,实现你的 功能,再考虑用 线程锁 让代码 完美)。
我确实用的第一种,但是我觉得挺不好的,因为这个需要及时回应给用户展示的。第二个方案怎么弄呢?
@艾紫霁: 当你 想到第1种方案的时候,说明 你很有觉悟。
第2种方案 再告诉你,你就能够理解了:
AutoResetEvent resetEvent = new AutoResetEvent(false); //创建一个 线程锁
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecievedComplete), new Info(){Socket=client,Buffer=buffer, Event =resetEvent});
resetEvent.Set(); //让 发送线程等待。
——————————————————————————————
接收的时候:
////////////////////我想把inf.Buffer 回应的数据,返回。
inf.Event.Reset(); //开启 线程锁:告知 发送线程,不用再等了。