Skip to content

Commit c2a6793

Browse files
committed
optimize LogWithThreadPoolStats
1 parent 5e5b5a2 commit c2a6793

2 files changed

Lines changed: 24 additions & 6 deletions

File tree

src/StackExchange.Redis/ConnectionMultiplexer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ private static async Task<bool> WaitAllIgnoreErrorsAsync(string name, Task[] tas
484484
}
485485

486486
var watch = ValueStopwatch.StartNew();
487-
log.LogWithThreadPoolStats($"Awaiting {tasks.Length} {name} task completion(s) for {timeoutMilliseconds}ms");
487+
log?.LogWithThreadPoolStats($"Awaiting {tasks.Length} {name} task completion(s) for {timeoutMilliseconds}ms");
488488
try
489489
{
490490
// if none error, great
@@ -497,7 +497,7 @@ private static async Task<bool> WaitAllIgnoreErrorsAsync(string name, Task[] tas
497497

498498
var allTasks = Task.WhenAll(tasks).ObserveErrors();
499499
bool all = await allTasks.TimeoutAfter(timeoutMs: remaining).ObserveErrors().ForAwait();
500-
log.LogWithThreadPoolStats(all ? $"All {tasks.Length} {name} tasks completed cleanly" : $"Not all {name} tasks completed cleanly (from {caller}#{callerLineNumber}, timeout {timeoutMilliseconds}ms)");
500+
log?.LogWithThreadPoolStats(all ? $"All {tasks.Length} {name} tasks completed cleanly" : $"Not all {name} tasks completed cleanly (from {caller}#{callerLineNumber}, timeout {timeoutMilliseconds}ms)");
501501
return all;
502502
}
503503
catch

src/StackExchange.Redis/LoggerExtensions.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,33 @@ internal static void LogWithThreadPoolStats(this ILogger? log, string message)
3232
return;
3333
}
3434

35-
var sb = new StringBuilder();
36-
sb.Append(message);
3735
_ = PerfCounterHelper.GetThreadPoolStats(out string iocp, out string worker, out string? workItems);
38-
sb.Append(", IOCP: ").Append(iocp).Append(", WORKER: ").Append(worker);
36+
37+
#if NET6_0_OR_GREATER
38+
// use DISH when possible
39+
// similar to: var composed = $"{message}, IOCP: {iocp}, WORKER: {worker}, ..."; on net6+
40+
var dish = new System.Runtime.CompilerServices.DefaultInterpolatedStringHandler(26, 4);
41+
dish.AppendFormatted(message);
42+
dish.AppendLiteral(", IOCP: ");
43+
dish.AppendFormatted(iocp);
44+
dish.AppendLiteral(", WORKER: ");
45+
dish.AppendFormatted(worker);
46+
if (workItems is not null)
47+
{
48+
dish.AppendLiteral(", POOL: ");
49+
dish.AppendFormatted(workItems);
50+
}
51+
var composed = dish.ToStringAndClear();
52+
#else
53+
var sb = new StringBuilder();
54+
sb.Append(message).Append(", IOCP: ").Append(iocp).Append(", WORKER: ").Append(worker);
3955
if (workItems is not null)
4056
{
4157
sb.Append(", POOL: ").Append(workItems);
4258
}
43-
log.LogInformationThreadPoolStats(sb.ToString());
59+
var composed = sb.ToString();
60+
#endif
61+
log.LogInformationThreadPoolStats(composed);
4462
}
4563

4664
// Generated LoggerMessage methods

0 commit comments

Comments
 (0)