62 lines
1.7 KiB
C#
62 lines
1.7 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(IEnumerable<IBalance> balances,ILogger<BalanceService> 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<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;
|
|
}
|
|
} |