Skip to content

Commit 8a44bda

Browse files
authored
Merge pull request #69 from dotnet-campus/t/lindexi/KeepLastReentrancyTask
支持在 KeepLastReentrancyTask 配置是否需要回到原来的线程
2 parents fec4b8b + 958f165 commit 8a44bda

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

AsyncWorkerCollection/Reentrancy/KeepLastReentrancyTask.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,24 @@ sealed class KeepLastReentrancyTask<TParameter, TReturn> : ReentrancyTask<TParam
4848
/// </summary>
4949
private readonly Queue<TaskWrapper> _skipQueue = new Queue<TaskWrapper>();
5050

51+
private readonly bool _configureAwait;
52+
5153
/// <summary>
5254
/// 创建以KeepLast策略执行的可重入任务。
5355
/// </summary>
5456
/// <param name="task">可重入任务本身。</param>
5557
public KeepLastReentrancyTask(Func<TParameter, Task<TReturn>> task) : base(task) { }
5658

59+
/// <summary>
60+
/// 创建以KeepLast策略执行的可重入任务。
61+
/// </summary>
62+
/// <param name="task">可重入任务本身。</param>
63+
/// <param name="configureAwait"></param>
64+
public KeepLastReentrancyTask(Func<TParameter, Task<TReturn>> task, bool configureAwait) : this(task)
65+
{
66+
_configureAwait = configureAwait;
67+
}
68+
5769
/// <summary>
5870
/// 以KeepLast策略执行重入任务,并获取此次重入任务的返回值。
5971
/// 此重入策略会确保执行当前队列中的最后一个任务,并对所有当前队列任务赋值该任务结果。
@@ -62,7 +74,7 @@ public KeepLastReentrancyTask(Func<TParameter, Task<TReturn>> task) : base(task)
6274
/// <returns>重入任务本次执行的返回值。</returns>
6375
public override Task<TReturn> InvokeAsync(TParameter arg)
6476
{
65-
var wrapper = new TaskWrapper(() => RunCore(arg));
77+
var wrapper = new TaskWrapper(() => RunCore(arg), _configureAwait);
6678
_queue.Enqueue(wrapper);
6779
Run();
6880
return wrapper.AsTask();
@@ -106,7 +118,7 @@ private async void Run()
106118
if (runTask != null)
107119
{
108120
// 内部已包含异常处理,因此外面可以无需捕获或者清理。
109-
await runTask.RunAsync().ConfigureAwait(false);
121+
await runTask.RunAsync().ConfigureAwait(_configureAwait);
110122
//完成后对等待队列中的项赋值
111123
if (runTask.Exception != null)
112124
{
@@ -156,14 +168,16 @@ private class TaskWrapper
156168
/// <summary>
157169
/// 创建一个任务包装。
158170
/// </summary>
159-
internal TaskWrapper(Func<Task<TReturn>> workingTask)
171+
internal TaskWrapper(Func<Task<TReturn>> workingTask, bool configureAwait)
160172
{
161173
_taskSource = new TaskCompletionSource<TReturn>();
162174
_task = workingTask;
175+
_configureAwait = configureAwait;
163176
}
164177

165178
private readonly TaskCompletionSource<TReturn> _taskSource;
166179
private readonly Func<Task<TReturn>> _task;
180+
private readonly bool _configureAwait;
167181

168182
public TReturn Result { get; set; }
169183
public Exception Exception { get; set; }
@@ -180,7 +194,7 @@ internal async Task RunAsync()
180194
{
181195
throw new InvalidOperationException("在指定 KeepLastReentrancyTask 的任务时,方法内不允许返回 null。请至少返回 Task.FromResult<object>(null)。");
182196
}
183-
var result = await task.ConfigureAwait(false);
197+
var result = await task.ConfigureAwait(_configureAwait);
184198
_taskSource.SetResult(result);
185199
Result = result;
186200
}

0 commit comments

Comments
 (0)