Skip to content

Commit 2402eff

Browse files
author
Jann Roder
committed
* Also wrap start/stop work in suppress scope
* refactor transaction scope wrapper
1 parent 4d39c6e commit 2402eff

2 files changed

Lines changed: 46 additions & 36 deletions

File tree

Winton.Extensions.Threading.Actor/ActorExtensions.cs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using System.Threading;
66
using System.Threading.Tasks;
7+
using System.Transactions;
78

89
namespace Winton.Extensions.Threading.Actor
910
{
@@ -30,15 +31,15 @@ public static IActor WithStartWork(this IActor self, ActorStartWork work)
3031
/// <param name="self">Actor</param>
3132
/// <param name="work">Work to do.</param>
3233
/// <returns>Actor</returns>
33-
public static IActor WithStartWork(this IActor self, Action work) => self.WithStartWork(new ActorStartWork(work));
34+
public static IActor WithStartWork(this IActor self, Action work) => self.WithStartWork(new ActorStartWork(SuppressTransactionScopeWrapper(work)));
3435

3536
/// <summary>
3637
/// Specify work for actor start-up.
3738
/// </summary>
3839
/// <param name="self">Actor</param>
3940
/// <param name="work">Async work to do.</param>
4041
/// <returns>Actor</returns>
41-
public static IActor WithStartWork(this IActor self, Func<Task> work) => self.WithStartWork(new ActorStartWork(work));
42+
public static IActor WithStartWork(this IActor self, Func<Task> work) => self.WithStartWork(new ActorStartWork(SuppressTransactionScopeWrapper(work)));
4243

4344
/// <summary>
4445
/// Specify work for actor start-up.
@@ -52,7 +53,7 @@ public static IActor WithStopWork(this IActor self, ActorStopWork work)
5253
return self;
5354
}
5455

55-
public static IActor WithStopWork(this IActor self, Action work) => self.WithStopWork(new ActorStopWork(work));
56+
public static IActor WithStopWork(this IActor self, Action work) => self.WithStopWork(new ActorStopWork(SuppressTransactionScopeWrapper(work)));
5657

5758
/// <summary>
5859
/// Enqueue a procedure.
@@ -184,5 +185,45 @@ public static CancellationToken StoppedToken(this IActor self)
184185

185186
return cancellationTokenSource.Token;
186187
}
188+
189+
internal static Func<T> SuppressTransactionScopeWrapper<T>(Func<T> function)
190+
{
191+
return () =>
192+
{
193+
using (var scope = new TransactionScope(
194+
TransactionScopeOption.Suppress,
195+
TransactionScopeAsyncFlowOption.Enabled))
196+
{
197+
try
198+
{
199+
return function();
200+
}
201+
finally
202+
{
203+
scope.Complete();
204+
}
205+
}
206+
};
207+
}
208+
209+
internal static Action SuppressTransactionScopeWrapper(Action action)
210+
{
211+
return () =>
212+
{
213+
using (var scope = new TransactionScope(
214+
TransactionScopeOption.Suppress,
215+
TransactionScopeAsyncFlowOption.Enabled))
216+
{
217+
try
218+
{
219+
action();
220+
}
221+
finally
222+
{
223+
scope.Complete();
224+
}
225+
}
226+
};
227+
}
187228
}
188229
}
Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Threading;
33
using System.Threading.Tasks;
4-
using System.Transactions;
54

65
namespace Winton.Extensions.Threading.Actor.Internal
76
{
@@ -18,22 +17,7 @@ public Task StartNew(Action action, CancellationToken cancellationToken, TaskCre
1817
ActorTask.CurrentActorTaskTraits = traits;
1918
ActorTask.CurrentCanceller = cancellationTokenSource;
2019

21-
void TransactionScopeWrapper(Action theAction)
22-
{
23-
using (var scope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled))
24-
{
25-
try
26-
{
27-
theAction();
28-
}
29-
finally
30-
{
31-
scope.Complete();
32-
}
33-
}
34-
}
35-
36-
return Task.Factory.StartNew(() => TransactionScopeWrapper(action), cancellationTokenSource.Token, taskCreationOptions | TaskCreationOptions.HideScheduler, _scheduler);
20+
return Task.Factory.StartNew(ActorExtensions.SuppressTransactionScopeWrapper(action), cancellationTokenSource.Token, taskCreationOptions | TaskCreationOptions.HideScheduler, _scheduler);
3721
}
3822

3923
public Task<T> StartNew<T>(Func<T> function, CancellationToken cancellationToken, TaskCreationOptions taskCreationOptions, ActorTaskTraits traits = ActorTaskTraits.None)
@@ -43,22 +27,7 @@ public Task<T> StartNew<T>(Func<T> function, CancellationToken cancellationToken
4327
ActorTask.CurrentActorTaskTraits = traits;
4428
ActorTask.CurrentCanceller = cancellationTokenSource;
4529

46-
T TransactionScopeWrapper(Func<T> theFunction)
47-
{
48-
using (var scope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled))
49-
{
50-
try
51-
{
52-
return theFunction();
53-
}
54-
finally
55-
{
56-
scope.Complete();
57-
}
58-
}
59-
}
60-
61-
return Task.Factory.StartNew(() => TransactionScopeWrapper(function), cancellationTokenSource.Token, taskCreationOptions | TaskCreationOptions.HideScheduler, _scheduler);
30+
return Task.Factory.StartNew(ActorExtensions.SuppressTransactionScopeWrapper(function), cancellationTokenSource.Token, taskCreationOptions | TaskCreationOptions.HideScheduler, _scheduler);
6231
}
6332
}
6433
}

0 commit comments

Comments
 (0)