【发布时间】:2020-10-23 17:20:19
【问题描述】:
我想问一下 System.Net.WebSockets 不是基于事件的原因是什么。在 JS 中,我只需要订阅事件:
// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');
// Connection opened
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
但在 C#System.Net.WebSockets 中,事件根本不存在。如果我想接收消息,我必须这样做:
while (true){
byte[]? buffer = new byte[1024 * 4];
var result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
// here I can call event.Invoke if i want to turn it into event-based
}
我可以理解,这可能是因为 C# 中的 WebSockets 的抽象级别比 JS 中的要低,我应该自己实现事件逻辑。
我完全不明白的是连接关闭检测。 System.Net.WebSockets 套接字有一个属性State,其中包含有关套接字当前状态的信息并根据它进行更改。
据我了解,这个属性是我知道套接字是否关闭的唯一方法。为什么我不能只听它的变化?定期轮询此属性真的是我检测套接字状态的唯一选择吗?同样,我可以自己实现逻辑,但会失去有效性(因为轮询)。为什么不能在每次设置此属性时触发一个事件?
【问题讨论】:
-
你使用的是原始套接字,如果你想让事件使用库,例如 Signalr 应该处理你想做的事情