OnOpenAsync
方法通常是在 WebSocket 连接打开时调用的异步方法。GetOrAddAsync
是 ConcurrentDictionary
类中的一个异步方法,用于获取与指定键关联的值,如果该键不存在,则添加一个新值。
ConcurrentDictionary
提供了线程安全的操作,避免了手动加锁的复杂性。GetOrAddAsync
允许在等待操作完成时不会阻塞调用线程,提高了应用程序的响应性。ConcurrentDictionary
是一种键值对存储结构。GetOrAddAsync
是一种异步方法,返回 Task<TValue>
。在 WebSocket 连接打开时,可能需要初始化一些资源或数据结构。使用 GetOrAddAsync
可以确保这些资源或数据结构只被初始化一次,即使在多线程环境下也是如此。
public class WebSocketHandler
{
private ConcurrentDictionary<string, WebSocket> _connections = new ConcurrentDictionary<string, WebSocket>();
public async Task OnOpenAsync(WebSocketContext context)
{
string connectionId = Guid.NewGuid().ToString();
WebSocket webSocket = context.WebSocket;
// 获取或添加连接
var added = await _connections.GetOrAddAsync(connectionId, _ => webSocket);
if (added == webSocket)
{
// 连接成功
Console.WriteLine($"New connection: {connectionId}");
}
else
{
// 连接已存在
Console.WriteLine($"Connection already exists: {connectionId}");
}
}
public async Task OnCloseAsync(string connectionId)
{
if (_connections.TryRemove(connectionId, out var webSocket))
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Connection closed", CancellationToken.None);
Console.WriteLine($"Connection closed: {connectionId}");
}
}
}
ConcurrentDictionary
和 GetOrAddAsync
可以避免这个问题。OnCloseAsync
方法中移除连接。通过上述方法,可以确保在 WebSocket 连接打开时,资源或数据结构只被初始化一次,并且在多线程环境下保持线程安全。
领取专属 10元无门槛券
手把手带您无忧上云