Skip to content

Commit a48c7e7

Browse files
committed
Refactor core performer to use custom class for wrapping a method
1 parent dbc1d38 commit a48c7e7

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

Diff for: src/Hangfire.Core/Server/CoreBackgroundJobPerformer.cs

+33-12
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,20 @@ private object InvokeMethod(PerformContext context, object instance, object[] ar
114114
try
115115
{
116116
var methodInfo = context.BackgroundJob.Job.Method;
117-
var tuple = Tuple.Create(methodInfo, instance, arguments);
117+
var method = new BackgroundJobMethod(methodInfo, instance, arguments);
118118
var returnType = methodInfo.ReturnType;
119119

120120
if (returnType.IsTaskLike(out var getTaskFunc))
121121
{
122122
if (_taskScheduler != null)
123123
{
124-
return InvokeOnTaskScheduler(context, tuple, getTaskFunc);
124+
return InvokeOnTaskScheduler(context, method, getTaskFunc);
125125
}
126126

127-
return InvokeOnTaskPump(context, tuple, getTaskFunc);
127+
return InvokeOnTaskPump(context, method, getTaskFunc);
128128
}
129129

130-
return InvokeSynchronously(tuple);
130+
return InvokeSynchronously(method);
131131
}
132132
catch (ArgumentException ex)
133133
{
@@ -151,22 +151,22 @@ private object InvokeMethod(PerformContext context, object instance, object[] ar
151151
}
152152
}
153153

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)
155155
{
156156
var scheduledTask = Task.Factory.StartNew(
157157
InvokeSynchronously,
158-
tuple,
158+
method,
159159
CancellationToken.None,
160160
TaskCreationOptions.None,
161161
_taskScheduler);
162162

163163
var result = scheduledTask.GetAwaiter().GetResult();
164164
if (result == null) return null;
165165

166-
return getTaskFunc(result).GetTaskLikeResult(result, tuple.Item1.ReturnType);
166+
return getTaskFunc(result).GetTaskLikeResult(result, method.ReturnType);
167167
}
168168

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)
170170
{
171171
// Using SynchronizationContext here is the best default option, where workers
172172
// are still running on synchronous dispatchers, and where a single job performer
@@ -186,7 +186,7 @@ private static object InvokeOnTaskPump(PerformContext context, Tuple<MethodInfo,
186186
{
187187
SynchronizationContext.SetSynchronizationContext(syncContext);
188188

189-
var result = InvokeSynchronously(tuple);
189+
var result = InvokeSynchronously(method);
190190
if (result == null) return null;
191191

192192
var task = getTaskFunc(result);
@@ -200,7 +200,7 @@ private static object InvokeOnTaskPump(PerformContext context, Tuple<MethodInfo,
200200
workItem.Item1(workItem.Item2);
201201
}
202202

203-
return task.GetTaskLikeResult(result, tuple.Item1.ReturnType);
203+
return task.GetTaskLikeResult(result, method.ReturnType);
204204
}
205205
}
206206
finally
@@ -211,8 +211,8 @@ private static object InvokeOnTaskPump(PerformContext context, Tuple<MethodInfo,
211211

212212
private static object InvokeSynchronously(object state)
213213
{
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();
216216
}
217217

218218
private static object[] SubstituteArguments(PerformContext context)
@@ -239,5 +239,26 @@ private static object[] SubstituteArguments(PerformContext context)
239239

240240
return result.ToArray();
241241
}
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+
}
242263
}
243264
}

0 commit comments

Comments
 (0)