huangxiaoqiang
2025-05-19 051aa9a0e7f58af6665fb4526e42cf8060fbaa05
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
 
public class WebSocketBackgroundService : BackgroundService
{
    private readonly IWebSocketClientService _webSocketClient;
    private readonly ILogger<WebSocketBackgroundService> _logger;
 
    public WebSocketBackgroundService(
        IWebSocketClientService webSocketClient,
        ILogger<WebSocketBackgroundService> logger)
    {
        _webSocketClient = webSocketClient;
        _logger = logger;
 
        // 订阅消息事件
        _webSocketClient.MessageReceived += OnMessageReceived;
    }
 
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                if (!IsConnected())
                {
                    await _webSocketClient.ConnectAsync();
                }
 
                // 可以在这里添加定期发送的消息或心跳
                await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error in WebSocket background service");
                await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken); // 等待后重试
            }
        }
    }
 
    private bool IsConnected()
    {
        // 根据实际实现返回连接状态
        return false; // 简化示例,实际应该检查真实状态
    }
 
    private void OnMessageReceived(object sender, string message)
    {
 
        _webSocketClient.SendAsync(message);
        _logger.LogInformation("处理 WebSocket 消息: {Message}", message);
        // 处理接收到的消息
    }
 
    public override async Task StopAsync(CancellationToken cancellationToken)
    {
        _webSocketClient.MessageReceived -= OnMessageReceived;
        await _webSocketClient.DisconnectAsync();
        await base.StopAsync(cancellationToken);
    }
}