2025-06-16 17:24:23 +08:00

67 lines
2.0 KiB
C#

using Microsoft.Extensions.Logging;
namespace Seyounth.Auto.Hs.Runtime.Balances;
public class BalanceService : IBalanceService
{
public IReadOnlyList<IBalance> Balances => _balances;
private readonly List<IBalance> _balances = new List<IBalance>();
private readonly ILogger<BalanceService> _logger;
public BalanceService(ILogger<BalanceService> logger)
{
_logger = logger;
//todo:向_balances里添加Balance
}
public async Task StartAsync()
{
await Task.WhenAll(_balances.Select(balance => balance.ConnectAsync().ContinueWith(t =>
{
if (t.IsCompletedSuccessfully)
_logger.LogInformation($"Balance {balance.Id} connected successfully.");
else
_logger.LogError($"Balance {balance.Id} failed to connect, error: {t.Exception?.Message}");
})).ToArray());
}
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<decimal?> WeighAsync(int id)
{
decimal rs = 0;
var balance = _balances.FirstOrDefault(b => b.Id == id);
if (balance != null)
{
Func<decimal, Task> 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;
}
}