我编码一个自定义的C#电报客户从TLSharp开始,修改了它以支持层54电报客户端更新和在同一会话API请求
我要处理来自服务器的电报都接收更新和使用API而无需打开单独的会话来执行此操作。
问题基本上是多线程访问连接到电报服务器的套接字。
这方案:
TelegramClient < ------- socket_1 [(session_1)] --------> TelegramServer
的问题是,为了收到我用了一段时间(真)周期电报服务器 基本上都是模式化的不断更新:
while(true){
data_cipher = await socket_1.receive() // listen for new stuff from the socket_1
data_plain = decrypt(data_cipher) // decrypt
processUpdate(data_plain) // process the update
}
现在,如果我想要的,例如,对于所有的聊天记录列表中查询电报服务器中,我是注册,我有 访问socket_1以发送此请求,并等待答案,但socket_1正在侦听,我显然无法访问它。
一种解决方案可能是使用的要求更新已被接收后,将被处理的载体, 的想法是这样的:
List<Request> pending_requests = new List<Request>() // list of requests added by another thread
while(true){
data_cipher = await socket_1.receive() // listen for new stuff from the socket_1
data_plain = decrypt(data_cipher) // decrypt
processUpdate(data_plain) // process the update
if(pending_requests.Count != 0){
foreach(Request r in pending_requests){
processRequest(r)
}
}
}
该解决方案是非常可怕的,因为我们处理只有更新后的要求,因此没有更新=没有请求处理......
另一种可能是使用某种类型的锁机构下面这样一个方案:
//Thread_updater
//--------------------------------------------
while(true){
lock(socket_1){
data_cipher = await socket_1.receive() // listen for new stuff from the socket_1
}
data_plain = decrypt(data_cipher) // decrypt
handleUpdate(data_plain) // process the update
}
--------------------------------------------
//Thread_requests
//--------------------------------------------
Request r = new Request(<stuff>);
lock(socket_1){
await sendRequest(r,socket_1)
}
--------------------------------------------
这个问题的最大问题是,一旦Thread_updater接受锁定,它将永远不会释放它,直到接收到更新为止......这与以前基本相同。 我也尝试玩取消任务或套接字超时,但我觉得我走错了路。
有没有一个优雅的解决方案/模式,以便以一种整洁的方式处理这个问题? 如上所述,我不想打开2个会话,因为它在逻辑上是错误的(这就像有两个客户端来处理接收更新和发送消息)。