@@ -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