@@ -48,12 +48,24 @@ sealed class KeepLastReentrancyTask<TParameter, TReturn> : ReentrancyTask<TParam
48
48
/// </summary>
49
49
private readonly Queue < TaskWrapper > _skipQueue = new Queue < TaskWrapper > ( ) ;
50
50
51
+ private readonly bool _configureAwait ;
52
+
51
53
/// <summary>
52
54
/// 创建以KeepLast策略执行的可重入任务。
53
55
/// </summary>
54
56
/// <param name="task">可重入任务本身。</param>
55
57
public KeepLastReentrancyTask ( Func < TParameter , Task < TReturn > > task ) : base ( task ) { }
56
58
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
+
57
69
/// <summary>
58
70
/// 以KeepLast策略执行重入任务,并获取此次重入任务的返回值。
59
71
/// 此重入策略会确保执行当前队列中的最后一个任务,并对所有当前队列任务赋值该任务结果。
@@ -62,7 +74,7 @@ public KeepLastReentrancyTask(Func<TParameter, Task<TReturn>> task) : base(task)
62
74
/// <returns>重入任务本次执行的返回值。</returns>
63
75
public override Task < TReturn > InvokeAsync ( TParameter arg )
64
76
{
65
- var wrapper = new TaskWrapper ( ( ) => RunCore ( arg ) ) ;
77
+ var wrapper = new TaskWrapper ( ( ) => RunCore ( arg ) , _configureAwait ) ;
66
78
_queue . Enqueue ( wrapper ) ;
67
79
Run ( ) ;
68
80
return wrapper . AsTask ( ) ;
@@ -106,7 +118,7 @@ private async void Run()
106
118
if ( runTask != null )
107
119
{
108
120
// 内部已包含异常处理,因此外面可以无需捕获或者清理。
109
- await runTask . RunAsync ( ) . ConfigureAwait ( false ) ;
121
+ await runTask . RunAsync ( ) . ConfigureAwait ( _configureAwait ) ;
110
122
//完成后对等待队列中的项赋值
111
123
if ( runTask . Exception != null )
112
124
{
@@ -156,14 +168,16 @@ private class TaskWrapper
156
168
/// <summary>
157
169
/// 创建一个任务包装。
158
170
/// </summary>
159
- internal TaskWrapper ( Func < Task < TReturn > > workingTask )
171
+ internal TaskWrapper ( Func < Task < TReturn > > workingTask , bool configureAwait )
160
172
{
161
173
_taskSource = new TaskCompletionSource < TReturn > ( ) ;
162
174
_task = workingTask ;
175
+ _configureAwait = configureAwait ;
163
176
}
164
177
165
178
private readonly TaskCompletionSource < TReturn > _taskSource ;
166
179
private readonly Func < Task < TReturn > > _task ;
180
+ private readonly bool _configureAwait ;
167
181
168
182
public TReturn Result { get ; set ; }
169
183
public Exception Exception { get ; set ; }
@@ -180,7 +194,7 @@ internal async Task RunAsync()
180
194
{
181
195
throw new InvalidOperationException ( "在指定 KeepLastReentrancyTask 的任务时,方法内不允许返回 null。请至少返回 Task.FromResult<object>(null)。" ) ;
182
196
}
183
- var result = await task . ConfigureAwait ( false ) ;
197
+ var result = await task . ConfigureAwait ( _configureAwait ) ;
184
198
_taskSource . SetResult ( result ) ;
185
199
Result = result ;
186
200
}
0 commit comments