using Microsoft.Extensions.Logging; namespace Seyounth.Auto.Hs.Runtime.Balances; public class BalanceService : IBalanceService { public IReadOnlyList Balances => _balances; private readonly List _balances = new List(); private readonly ILogger _logger; public BalanceService(IEnumerable balances,ILogger logger) { _logger = logger; _balances.AddRange(balances); //todo:向_balances里添加Balance } public async Task StartAsync() { await Task.WhenAll(_balances.Select(e => e.ConnectAsync())); } public async Task StopAsync() { await Task.WhenAll(_balances.Select(balance => balance.DisconnectAsync().ContinueWith(t => { if (t.IsCompletedSuccessfully) _logger.LogInformation($"Balance {balance.Id} disconnected successfully."); else _logger.LogError($"Balance {balance.Id} failed to disconnect, error: {t.Exception?.Message}"); })).ToArray()); } public async Task WeighAsync(int id) { decimal rs = 0; var balance = _balances.FirstOrDefault(b => b.Id == id); if (balance != null) { Func weightChangedHandler = (weight) => { rs = weight; return Task.CompletedTask; }; balance.OnWeightChanged += weightChangedHandler; while (rs == 0) { await Task.Delay(100); } balance.OnWeightChanged -= weightChangedHandler; return rs; } _logger.LogError($"Balance {id} not found."); return null; } }