微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们是否应该使用 Discord.NET 取消订阅已订阅的事件

如何解决我们是否应该使用 Discord.NET 取消订阅已订阅的事件

我想知道我们是否应该取消订阅我们订阅的事件,因为他们的 documentation 中的示例没有,但我发现了其他示例,他们确实这样做了。请详细说明原因。

Should I unsubscribe from events?

基本上,如果您确定订阅对象的生命周期将超过事件源,则应该取消订阅,否则会创建不必要的引用。

services.AddSingleton(new discordSocketClient(new discordSocketConfig { LogLevel = LogSeverity.Info }));
services.AddSingleton(new CommandService(new CommandServiceConfig { LogLevel = LogSeverity.Info }));
services.AddHostedService<discordHostedService>();
public class discordHostedService : IHostedService,Idisposable
{
    private readonly ILogger _logger;
    private readonly IServiceProvider _serviceProvider;
    private readonly IOptions<discordOptions> _discordOptions;
    private readonly discordSocketClient _client;
    private readonly CommandService _commands;

    public discordHostedService(
        ILogger logger,IServiceProvider serviceProvider,IOptions<discordOptions> discordOptions,discordSocketClient client,CommandService commands)
    {
        _logger = logger;
        _serviceProvider = serviceProvider;
        _discordOptions = discordOptions;
        _client = client;
        _commands = commands;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        _client.Ready += ReadyAsync;
        _client.MessageReceived += HandleCommandAsync;
        _client.Log += LogAsync;

        _commands.CommandExecuted += CommandExecutedAsync;
        _commands.Log += LogAsync;

        await _commands.AddModulesAsync(Assembly.GetEntryAssembly(),_serviceProvider);

        await _client.LoginAsync(TokenType.Bot,_discordOptions.Value.Token);
        await _client.StartAsync();
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {
        await _client.SetStatusAsync(UserStatus.Offline);
        await _client.SetGameAsync(null);
        await _client.StopAsync();

        _client.Ready -= ReadyAsync;
        _client.MessageReceived -= HandleCommandAsync;
        _client.Log -= LogAsync;

        _commands.CommandExecuted -= CommandExecutedAsync;
        _commands.Log -= LogAsync;
    }

    private async Task ReadyAsync()
    {
        ...
    }

    private async Task HandleCommandAsync(SocketMessage messageParam)
    {
        ...
    }

    private Task LogAsync(LogMessage messageParam)
    {
        return Task.CompletedTask;
    }

    public async Task CommandExecutedAsync(Optional<CommandInfo> command,ICommandContext context,IResult result)
    {
        ...
    }

    private bool _disposed = false;

    public void dispose()
    {
        dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void dispose(bool disposing)
    {
        if (_disposed)
            return;

        if (disposing)
        {
            if (_client != null)
            {
                _client.dispose();
            }
        }

        _disposed = true;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。