С точки зрения дизайна, вызов StopAsync в Dispose?
Я использую Discord.Net для Discord Chat Control Bot, и мне интересно, следует ли мне выполнять его в IDisposable или нет. Что вы, ребята, обычно делаете в таких ситуациях? Если я не позвоню, бот останется в живых в течение минуты, а затем у него истечет время ожидания. Когда я звоню
StopAsync
, он работает как положено: бот сразу же запускается при выходе.
Вопрос на самом деле не относится к Discord.Net, а к любому классу, который использует
StartAsync/StopAsync
стереотип. Что бы вы сделали в этой ситуации? Возможный
IAsyncDisposable
выполнение?
public class DiscordClient : IDiscordClient, IDisposable
{
private bool _disposed;
private readonly ILogger<DiscordClient> _logger;
private readonly IServiceProvider _serviceProvider;
private readonly DiscordOptions _options;
private readonly DiscordSocketClient _client;
private readonly CommandService _commandService;
public DiscordClient(
ILogger<DiscordClient> logger,
IServiceProvider serviceProvider,
IOptions<DiscordOptions> options,
DiscordSocketClient client,
CommandService commands)
{
_logger = logger;
_serviceProvider = serviceProvider;
_options = options.Value;
_client = client;
_commandService = commands;
}
public async Task StartAsync()
{
if (string.IsNullOrEmpty(_options.Token)) return;
_logger.LogDebug($"{nameof(DiscordClient)} is starting.");
_client.Ready += DiscordClient_ReadyAsync;
_client.MessageReceived += DiscordClient_HandleCommandAsync;
_client.Log += DiscordClient_LogAsync;
_commandService.CommandExecuted += DiscordClient_CommandExecutedAsync;
_commandService.Log += DiscordClient_LogAsync;
await _commandService.AddModulesAsync(Assembly.GetExecutingAssembly(), _serviceProvider)
.ConfigureAwait(false);
await _client.LoginAsync(TokenType.Bot, _options.Token).ConfigureAwait(false);
await _client.StartAsync().ConfigureAwait(false);
}
public async Task StopAsync()
{
if (string.IsNullOrEmpty(_options.Token)) return;
_logger.LogDebug($"{nameof(DiscordClient)} is stopping.");
await _client.SetStatusAsync(UserStatus.Offline).ConfigureAwait(false);
await _client.SetGameAsync(null).ConfigureAwait(false);
await _client.StopAsync().ConfigureAwait(false);
_client.Ready -= DiscordClient_ReadyAsync;
_client.MessageReceived -= DiscordClient_HandleCommandAsync;
_client.Log -= DiscordClient_LogAsync;
_commandService.CommandExecuted -= DiscordClient_CommandExecutedAsync;
_commandService.Log -= DiscordClient_LogAsync;
}
...
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (_disposed) return;
if (disposing)
{
StopAsync().GetAwaiter().GetResult();
}
_disposed = true;
}
}