С точки зрения дизайна, вызов 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;
    }
}

0 ответов

Другие вопросы по тегам