Skip to content

Commit 9b4981d

Browse files
committed
Added optimizations to existing DispatcherQueue extensions
1 parent 703c57f commit 9b4981d

File tree

1 file changed

+46
-42
lines changed

1 file changed

+46
-42
lines changed

CommunityToolkit.WinUI/Extensions/DispatcherQueueExtensions.cs

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -44,31 +44,32 @@ public static Task EnqueueAsync(this DispatcherQueue dispatcher, Action function
4444
}
4545
}
4646

47-
static Task TryEnqueueAsync(DispatcherQueue dispatcher, Action function, DispatcherQueuePriority priority)
48-
{
49-
var taskCompletionSource = new TaskCompletionSource<object?>();
47+
var taskCompletionSource = new TaskCompletionSource();
5048

51-
if (!dispatcher.TryEnqueue(priority, () =>
49+
bool success = dispatcher.TryEnqueue(
50+
priority,
51+
static (function, taskCompletionSource) =>
5252
{
5353
try
5454
{
5555
function();
5656

57-
taskCompletionSource.SetResult(null);
57+
taskCompletionSource.SetResult();
5858
}
5959
catch (Exception e)
6060
{
6161
taskCompletionSource.SetException(e);
6262
}
63-
}))
64-
{
65-
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
66-
}
63+
},
64+
function,
65+
taskCompletionSource);
6766

68-
return taskCompletionSource.Task;
67+
if (success)
68+
{
69+
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
6970
}
7071

71-
return TryEnqueueAsync(dispatcher, function, priority);
72+
return taskCompletionSource.Task;
7273
}
7374

7475
/// <summary>
@@ -95,11 +96,11 @@ public static Task<T> EnqueueAsync<T>(this DispatcherQueue dispatcher, Func<T> f
9596
}
9697
}
9798

98-
static Task<T> TryEnqueueAsync(DispatcherQueue dispatcher, Func<T> function, DispatcherQueuePriority priority)
99-
{
100-
var taskCompletionSource = new TaskCompletionSource<T>();
99+
var taskCompletionSource = new TaskCompletionSource<T>();
101100

102-
if (!dispatcher.TryEnqueue(priority, () =>
101+
bool success = dispatcher.TryEnqueue(
102+
priority,
103+
static (function, taskCompletionSource) =>
103104
{
104105
try
105106
{
@@ -109,15 +110,16 @@ static Task<T> TryEnqueueAsync(DispatcherQueue dispatcher, Func<T> function, Dis
109110
{
110111
taskCompletionSource.SetException(e);
111112
}
112-
}))
113-
{
114-
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
115-
}
113+
},
114+
function,
115+
taskCompletionSource);
116116

117-
return taskCompletionSource.Task;
117+
if (!success)
118+
{
119+
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
118120
}
119121

120-
return TryEnqueueAsync(dispatcher, function, priority);
122+
return taskCompletionSource.Task;
121123
}
122124

123125
/// <summary>
@@ -152,19 +154,19 @@ public static Task EnqueueAsync(this DispatcherQueue dispatcher, Func<Task> func
152154
}
153155
}
154156

155-
static Task TryEnqueueAsync(DispatcherQueue dispatcher, Func<Task> function, DispatcherQueuePriority priority)
156-
{
157-
var taskCompletionSource = new TaskCompletionSource<object?>();
157+
var taskCompletionSource = new TaskCompletionSource();
158158

159-
if (!dispatcher.TryEnqueue(priority, async () =>
159+
bool success = dispatcher.TryEnqueue(
160+
priority,
161+
static async (function, taskCompletionSource) =>
160162
{
161163
try
162164
{
163165
if (function() is Task awaitableResult)
164166
{
165167
await awaitableResult.ConfigureAwait(false);
166168

167-
taskCompletionSource.SetResult(null);
169+
taskCompletionSource.SetResult();
168170
}
169171
else
170172
{
@@ -175,15 +177,16 @@ static Task TryEnqueueAsync(DispatcherQueue dispatcher, Func<Task> function, Dis
175177
{
176178
taskCompletionSource.SetException(e);
177179
}
178-
}))
179-
{
180-
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
181-
}
180+
},
181+
function,
182+
taskCompletionSource);
182183

183-
return taskCompletionSource.Task;
184+
if (!success)
185+
{
186+
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
184187
}
185188

186-
return TryEnqueueAsync(dispatcher, function, priority);
189+
return taskCompletionSource.Task;
187190
}
188191

189192
/// <summary>
@@ -215,11 +218,11 @@ public static Task<T> EnqueueAsync<T>(this DispatcherQueue dispatcher, Func<Task
215218
}
216219
}
217220

218-
static Task<T> TryEnqueueAsync(DispatcherQueue dispatcher, Func<Task<T>> function, DispatcherQueuePriority priority)
219-
{
220-
var taskCompletionSource = new TaskCompletionSource<T>();
221+
var taskCompletionSource = new TaskCompletionSource<T>();
221222

222-
if (!dispatcher.TryEnqueue(priority, async () =>
223+
bool success = dispatcher.TryEnqueue(
224+
priority,
225+
static async (function, taskCompletionSource) =>
223226
{
224227
try
225228
{
@@ -238,15 +241,16 @@ static Task<T> TryEnqueueAsync(DispatcherQueue dispatcher, Func<Task<T>> functio
238241
{
239242
taskCompletionSource.SetException(e);
240243
}
241-
}))
242-
{
243-
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
244-
}
244+
},
245+
function,
246+
taskCompletionSource);
245247

246-
return taskCompletionSource.Task;
248+
if (!success)
249+
{
250+
taskCompletionSource.SetException(GetEnqueueException("Failed to enqueue the operation"));
247251
}
248252

249-
return TryEnqueueAsync(dispatcher, function, priority);
253+
return taskCompletionSource.Task;
250254
}
251255

252256
/// <summary>

0 commit comments

Comments
 (0)