@@ -114,20 +114,20 @@ private object InvokeMethod(PerformContext context, object instance, object[] ar
114
114
try
115
115
{
116
116
var methodInfo = context . BackgroundJob . Job . Method ;
117
- var tuple = Tuple . Create ( methodInfo , instance , arguments ) ;
117
+ var method = new BackgroundJobMethod ( methodInfo , instance , arguments ) ;
118
118
var returnType = methodInfo . ReturnType ;
119
119
120
120
if ( returnType . IsTaskLike ( out var getTaskFunc ) )
121
121
{
122
122
if ( _taskScheduler != null )
123
123
{
124
- return InvokeOnTaskScheduler ( context , tuple , getTaskFunc ) ;
124
+ return InvokeOnTaskScheduler ( context , method , getTaskFunc ) ;
125
125
}
126
126
127
- return InvokeOnTaskPump ( context , tuple , getTaskFunc ) ;
127
+ return InvokeOnTaskPump ( context , method , getTaskFunc ) ;
128
128
}
129
129
130
- return InvokeSynchronously ( tuple ) ;
130
+ return InvokeSynchronously ( method ) ;
131
131
}
132
132
catch ( ArgumentException ex )
133
133
{
@@ -151,22 +151,22 @@ private object InvokeMethod(PerformContext context, object instance, object[] ar
151
151
}
152
152
}
153
153
154
- private object InvokeOnTaskScheduler ( PerformContext context , Tuple < MethodInfo , object , object [ ] > tuple , Func < object , Task > getTaskFunc )
154
+ private object InvokeOnTaskScheduler ( PerformContext context , BackgroundJobMethod method , Func < object , Task > getTaskFunc )
155
155
{
156
156
var scheduledTask = Task . Factory . StartNew (
157
157
InvokeSynchronously ,
158
- tuple ,
158
+ method ,
159
159
CancellationToken . None ,
160
160
TaskCreationOptions . None ,
161
161
_taskScheduler ) ;
162
162
163
163
var result = scheduledTask . GetAwaiter ( ) . GetResult ( ) ;
164
164
if ( result == null ) return null ;
165
165
166
- return getTaskFunc ( result ) . GetTaskLikeResult ( result , tuple . Item1 . ReturnType ) ;
166
+ return getTaskFunc ( result ) . GetTaskLikeResult ( result , method . ReturnType ) ;
167
167
}
168
168
169
- private static object InvokeOnTaskPump ( PerformContext context , Tuple < MethodInfo , object , object [ ] > tuple , Func < object , Task > getTaskFunc )
169
+ private static object InvokeOnTaskPump ( PerformContext context , BackgroundJobMethod method , Func < object , Task > getTaskFunc )
170
170
{
171
171
// Using SynchronizationContext here is the best default option, where workers
172
172
// are still running on synchronous dispatchers, and where a single job performer
@@ -186,7 +186,7 @@ private static object InvokeOnTaskPump(PerformContext context, Tuple<MethodInfo,
186
186
{
187
187
SynchronizationContext . SetSynchronizationContext ( syncContext ) ;
188
188
189
- var result = InvokeSynchronously ( tuple ) ;
189
+ var result = InvokeSynchronously ( method ) ;
190
190
if ( result == null ) return null ;
191
191
192
192
var task = getTaskFunc ( result ) ;
@@ -200,7 +200,7 @@ private static object InvokeOnTaskPump(PerformContext context, Tuple<MethodInfo,
200
200
workItem . Item1 ( workItem . Item2 ) ;
201
201
}
202
202
203
- return task . GetTaskLikeResult ( result , tuple . Item1 . ReturnType ) ;
203
+ return task . GetTaskLikeResult ( result , method . ReturnType ) ;
204
204
}
205
205
}
206
206
finally
@@ -211,8 +211,8 @@ private static object InvokeOnTaskPump(PerformContext context, Tuple<MethodInfo,
211
211
212
212
private static object InvokeSynchronously ( object state )
213
213
{
214
- var data = ( Tuple < MethodInfo , object , object [ ] > ) state ;
215
- return data . Item1 . Invoke ( data . Item2 , data . Item3 ) ;
214
+ var method = ( BackgroundJobMethod ) state ;
215
+ return method . Invoke ( ) ;
216
216
}
217
217
218
218
private static object [ ] SubstituteArguments ( PerformContext context )
@@ -239,5 +239,26 @@ private static object[] SubstituteArguments(PerformContext context)
239
239
240
240
return result . ToArray ( ) ;
241
241
}
242
+
243
+ private sealed class BackgroundJobMethod
244
+ {
245
+ private readonly MethodInfo _methodInfo ;
246
+ private readonly object _instance ;
247
+ private readonly object [ ] _parameters ;
248
+
249
+ public BackgroundJobMethod ( MethodInfo methodInfo , object instance , object [ ] parameters )
250
+ {
251
+ _methodInfo = methodInfo ;
252
+ _instance = instance ;
253
+ _parameters = parameters ;
254
+ }
255
+
256
+ public Type ReturnType => _methodInfo . ReturnType ;
257
+
258
+ public object Invoke ( )
259
+ {
260
+ return _methodInfo . Invoke ( _instance , _parameters ) ;
261
+ }
262
+ }
242
263
}
243
264
}
0 commit comments