diff --git a/ThirdParty/SmartThreadPool/WorkItem.cs b/ThirdParty/SmartThreadPool/WorkItem.cs
index 3814ba9a0e..141f4b1bab 100644
--- a/ThirdParty/SmartThreadPool/WorkItem.cs
+++ b/ThirdParty/SmartThreadPool/WorkItem.cs
@@ -64,7 +64,7 @@ namespace Amib.Threading.Internal
///
/// Stores the caller's context
///
- private readonly CallerThreadContext _callerContext;
+ private ExecutionContext _callerContext = null;
///
/// Holds the result of the mehtod
@@ -205,9 +205,13 @@ namespace Amib.Threading.Internal
_workItemsGroup = workItemsGroup;
_workItemInfo = workItemInfo;
- if (_workItemInfo.UseCallerCallContext)
+ if (_workItemInfo.UseCallerCallContext && !ExecutionContext.IsFlowSuppressed())
{
- _callerContext = CallerThreadContext.Capture(_workItemInfo.UseCallerCallContext);
+ ExecutionContext ec = ExecutionContext.Capture();
+ if(ec != null)
+ _callerContext = ec.CreateCopy();
+ ec.Dispose();
+ ec = null;
}
_callback = callback;
@@ -326,10 +330,7 @@ namespace Amib.Threading.Internal
{
try
{
- if (null != _workItemCompletedEvent)
- {
- _workItemCompletedEvent(this);
- }
+ _workItemCompletedEvent?.Invoke(this);
}
catch // Suppress exceptions
{ }
@@ -339,10 +340,7 @@ namespace Amib.Threading.Internal
{
try
{
- if (null != _workItemStartedEvent)
- {
- _workItemStartedEvent(this);
- }
+ _workItemStartedEvent?.Invoke(this);
}
catch // Suppress exceptions
{ }
@@ -353,13 +351,6 @@ namespace Amib.Threading.Internal
///
private void ExecuteWorkItem()
{
- CallerThreadContext ctc = null;
- if (null != _callerContext)
- {
- ctc = CallerThreadContext.Capture(_callerContext.CapturedCallContext);
- CallerThreadContext.Apply(_callerContext);
- }
-
Exception exception = null;
object result = null;
@@ -367,7 +358,17 @@ namespace Amib.Threading.Internal
{
try
{
- result = _callback(_state);
+ if(_callerContext == null)
+ result = _callback(_state);
+ else
+ {
+ ContextCallback _ccb = new ContextCallback( o =>
+ {
+ result =_callback(o);
+ });
+
+ ExecutionContext.Run(_callerContext, _ccb, _state);
+ }
}
catch (Exception e)
{
@@ -401,12 +402,6 @@ namespace Amib.Threading.Internal
}
}
- if (null != _callerContext)
- {
- CallerThreadContext.Apply(ctc);
- }
-
-
if (!SmartThreadPool.IsWorkItemCanceled)
{
SetResult(result, exception);
@@ -967,6 +962,12 @@ namespace Amib.Threading.Internal
public void DisposeOfState()
{
+ if(_callerContext != null)
+ {
+ _callerContext.Dispose();
+ _callerContext = null;
+ }
+
if (_workItemInfo.DisposeOfStateObjects)
{
IDisposable disp = _state as IDisposable;