我正在使用Alchemy-Websockets作为服务器,我在服务器上的自己的线程中发送和接收来自外部客户端的消息。这很好用,但现在我还想在不同的线程中发送源自服务器的消息。这是我的主要设置:
public WebSocket(int port, IRedisClient _redis)
{
Console.WriteLine("Server at " + port);
Redis = _redis;
// instantiate a new server - acceptable port and IP range,
// and set up your methods.
//clients = new Dictionary<string, UserContext>();
subscriber_list = new Dictionary<string, Dictionary<string, UserContext>>{ };
var aServer = new WebSocketServer(port, System.Net.IPAddress.Any)
{
OnReceive = OnReceive,
OnConnect = OnConnect,
OnConnected = OnConnected,
OnDisconnect = OnDisconnect,
TimeOut = new TimeSpan(0, 5, 0)
};
aServer.Start();
}
此代码位于自己的线程上启动的类中。问题是,如果我想将数据发送到此websocket的客户端,我该如何处理多线程?我是否只是添加一个锁定机制,以便在使用它的同时不使用特定的“UserContext”?我是否在aServer.Start()之后放置了一个while循环并阻止我正在等待的基于服务器的通信?像这样?:
aServer.Start();
while(true){
// block on messages from my other thread (not from the websocket)
// get lock for a user context
UserContext.Send(myMessage);
Thread.Sleep(1000);
}
Thread.Sleep并不意味着使websocket睡眠并错过套接字上的消息。看看其他例子我认为这不应该发生,因为炼金术服务器也在它自己的线程中。
答案 0 :(得分:1)
Alchemy在内部是异步的,但是如果你使用while(true) + Thread.Sleep
来阻止处理程序,你可能会阻止连接并阻塞执行线程对等连接。
您应该在某处注册UserContext
,例如clientID或userID或userId + connectionID关联的当前连接列表。每当您想要向用户发送内容时,您都会浏览该列表,找到连接并发送内容。您必须小心并确保不要从同一UserContext
中的两个线程写入,因此请考虑使用Producer / Consumer模式。
有很多方法可以做到这一点。但是你不能只用无限循环来阻止一个事件处理程序。