Added config for handler timeout duration
This commit is contained in:
@@ -21,8 +21,6 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
public partial class DiscordSocketClient : BaseDiscordClient, IDiscordClient
|
public partial class DiscordSocketClient : BaseDiscordClient, IDiscordClient
|
||||||
{
|
{
|
||||||
private const int HandlerTimeoutMillis = 3000;
|
|
||||||
|
|
||||||
private readonly ConcurrentQueue<ulong> _largeGuilds;
|
private readonly ConcurrentQueue<ulong> _largeGuilds;
|
||||||
private readonly JsonSerializer _serializer;
|
private readonly JsonSerializer _serializer;
|
||||||
private readonly SemaphoreSlim _connectionGroupLock;
|
private readonly SemaphoreSlim _connectionGroupLock;
|
||||||
@@ -59,7 +57,7 @@ namespace Discord.WebSocket
|
|||||||
internal UdpSocketProvider UdpSocketProvider { get; private set; }
|
internal UdpSocketProvider UdpSocketProvider { get; private set; }
|
||||||
internal WebSocketProvider WebSocketProvider { get; private set; }
|
internal WebSocketProvider WebSocketProvider { get; private set; }
|
||||||
internal bool AlwaysDownloadUsers { get; private set; }
|
internal bool AlwaysDownloadUsers { get; private set; }
|
||||||
internal bool EnableHandlerTimeouts { get; private set; }
|
internal int? HandlerTimeout { get; private set; }
|
||||||
|
|
||||||
internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient;
|
internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient;
|
||||||
public new SocketSelfUser CurrentUser { get { return base.CurrentUser as SocketSelfUser; } private set { base.CurrentUser = value; } }
|
public new SocketSelfUser CurrentUser { get { return base.CurrentUser as SocketSelfUser; } private set { base.CurrentUser = value; } }
|
||||||
@@ -86,7 +84,7 @@ namespace Discord.WebSocket
|
|||||||
UdpSocketProvider = config.UdpSocketProvider;
|
UdpSocketProvider = config.UdpSocketProvider;
|
||||||
WebSocketProvider = config.WebSocketProvider;
|
WebSocketProvider = config.WebSocketProvider;
|
||||||
AlwaysDownloadUsers = config.AlwaysDownloadUsers;
|
AlwaysDownloadUsers = config.AlwaysDownloadUsers;
|
||||||
EnableHandlerTimeouts = config.EnableHandlerTimeouts;
|
HandlerTimeout = config.HandlerTimeout;
|
||||||
State = new ClientState(0, 0);
|
State = new ClientState(0, 0);
|
||||||
_heartbeatTimes = new ConcurrentQueue<long>();
|
_heartbeatTimes = new ConcurrentQueue<long>();
|
||||||
|
|
||||||
@@ -1671,7 +1669,7 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
if (eventHandler.HasSubscribers)
|
if (eventHandler.HasSubscribers)
|
||||||
{
|
{
|
||||||
if (EnableHandlerTimeouts)
|
if (HandlerTimeout.HasValue)
|
||||||
await TimeoutWrap(name, () => eventHandler.InvokeAsync()).ConfigureAwait(false);
|
await TimeoutWrap(name, () => eventHandler.InvokeAsync()).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await eventHandler.InvokeAsync().ConfigureAwait(false);
|
await eventHandler.InvokeAsync().ConfigureAwait(false);
|
||||||
@@ -1681,7 +1679,7 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
if (eventHandler.HasSubscribers)
|
if (eventHandler.HasSubscribers)
|
||||||
{
|
{
|
||||||
if (EnableHandlerTimeouts)
|
if (HandlerTimeout.HasValue)
|
||||||
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg)).ConfigureAwait(false);
|
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg)).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await eventHandler.InvokeAsync(arg).ConfigureAwait(false);
|
await eventHandler.InvokeAsync(arg).ConfigureAwait(false);
|
||||||
@@ -1691,7 +1689,7 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
if (eventHandler.HasSubscribers)
|
if (eventHandler.HasSubscribers)
|
||||||
{
|
{
|
||||||
if (EnableHandlerTimeouts)
|
if (HandlerTimeout.HasValue)
|
||||||
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2)).ConfigureAwait(false);
|
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2)).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await eventHandler.InvokeAsync(arg1, arg2).ConfigureAwait(false);
|
await eventHandler.InvokeAsync(arg1, arg2).ConfigureAwait(false);
|
||||||
@@ -1701,7 +1699,7 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
if (eventHandler.HasSubscribers)
|
if (eventHandler.HasSubscribers)
|
||||||
{
|
{
|
||||||
if (EnableHandlerTimeouts)
|
if (HandlerTimeout.HasValue)
|
||||||
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2, arg3)).ConfigureAwait(false);
|
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2, arg3)).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await eventHandler.InvokeAsync(arg1, arg2, arg3).ConfigureAwait(false);
|
await eventHandler.InvokeAsync(arg1, arg2, arg3).ConfigureAwait(false);
|
||||||
@@ -1711,7 +1709,7 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
if (eventHandler.HasSubscribers)
|
if (eventHandler.HasSubscribers)
|
||||||
{
|
{
|
||||||
if (EnableHandlerTimeouts)
|
if (HandlerTimeout.HasValue)
|
||||||
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2, arg3, arg4)).ConfigureAwait(false);
|
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2, arg3, arg4)).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await eventHandler.InvokeAsync(arg1, arg2, arg3, arg4).ConfigureAwait(false);
|
await eventHandler.InvokeAsync(arg1, arg2, arg3, arg4).ConfigureAwait(false);
|
||||||
@@ -1721,7 +1719,7 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
if (eventHandler.HasSubscribers)
|
if (eventHandler.HasSubscribers)
|
||||||
{
|
{
|
||||||
if (EnableHandlerTimeouts)
|
if (HandlerTimeout.HasValue)
|
||||||
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2, arg3, arg4, arg5)).ConfigureAwait(false);
|
await TimeoutWrap(name, () => eventHandler.InvokeAsync(arg1, arg2, arg3, arg4, arg5)).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
await eventHandler.InvokeAsync(arg1, arg2, arg3, arg4, arg5).ConfigureAwait(false);
|
await eventHandler.InvokeAsync(arg1, arg2, arg3, arg4, arg5).ConfigureAwait(false);
|
||||||
@@ -1731,7 +1729,7 @@ namespace Discord.WebSocket
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var timeoutTask = Task.Delay(HandlerTimeoutMillis);
|
var timeoutTask = Task.Delay(HandlerTimeout.Value);
|
||||||
var handlersTask = action();
|
var handlersTask = action();
|
||||||
if (await Task.WhenAny(timeoutTask, handlersTask).ConfigureAwait(false) == timeoutTask)
|
if (await Task.WhenAny(timeoutTask, handlersTask).ConfigureAwait(false) == timeoutTask)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ namespace Discord.WebSocket
|
|||||||
|
|
||||||
/// <summary> Gets or sets whether or not all users should be downloaded as guilds come available. </summary>
|
/// <summary> Gets or sets whether or not all users should be downloaded as guilds come available. </summary>
|
||||||
public bool AlwaysDownloadUsers { get; set; } = false;
|
public bool AlwaysDownloadUsers { get; set; } = false;
|
||||||
/// <summary> Gets or sets whether or not warnings should be logged if an event handler is taking too long to execute. </summary>
|
/// <summary> Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. Null disables this check. </summary>
|
||||||
public bool EnableHandlerTimeouts { get; set; } = true;
|
public int? HandlerTimeout { get; set; } = 3000;
|
||||||
|
|
||||||
public DiscordSocketConfig()
|
public DiscordSocketConfig()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user