This repository was archived by the owner on Dec 5, 2024. It is now read-only.
File tree Expand file tree Collapse file tree 4 files changed +72
-14
lines changed
tests/TaskSystemIntegrationTests Expand file tree Collapse file tree 4 files changed +72
-14
lines changed Original file line number Diff line number Diff line change @@ -10,6 +10,14 @@ class ActionTask : TaskBase
10
10
protected Action < bool > Callback { get ; }
11
11
protected Action < bool , Exception > CallbackWithException { get ; }
12
12
13
+ public ActionTask ( CancellationToken token , Action action )
14
+ : base ( token )
15
+ {
16
+ Guard . ArgumentNotNull ( action , "action" ) ;
17
+ this . Callback = _ => action ( ) ;
18
+ Name = "ActionTask" ;
19
+ }
20
+
13
21
public ActionTask ( CancellationToken token , Action < bool > action )
14
22
: base ( token )
15
23
{
@@ -123,6 +131,14 @@ class FuncTask<T> : TaskBase<T>
123
131
protected Func < bool , T > Callback { get ; }
124
132
protected Func < bool , Exception , T > CallbackWithException { get ; }
125
133
134
+ public FuncTask ( CancellationToken token , Func < T > action )
135
+ : base ( token )
136
+ {
137
+ Guard . ArgumentNotNull ( action , "action" ) ;
138
+ this . Callback = _ => action ( ) ;
139
+ Name = $ "FuncTask<{ typeof ( T ) } >";
140
+ }
141
+
126
142
public FuncTask ( CancellationToken token , Func < bool , T > action )
127
143
: base ( token )
128
144
{
Original file line number Diff line number Diff line change @@ -80,12 +80,30 @@ public TaskBase(CancellationToken token)
80
80
81
81
public TaskBase ( Task task )
82
82
{
83
- task . ContinueWith ( t =>
83
+ Task = new Task ( t =>
84
84
{
85
+ var scheduler = TaskManager . GetScheduler ( Affinity ) ;
85
86
RaiseOnStart ( ) ;
86
- RaiseOnEnd ( ) ;
87
- } , Token , runAlwaysOptions , TaskScheduler . Current ) ;
88
- Task = task ;
87
+ var tk = ( ( Task ) t ) ;
88
+ try
89
+ {
90
+ if ( tk . Status == TaskStatus . Created && ! tk . IsCompleted &&
91
+ ( ( tk . CreationOptions & ( TaskCreationOptions ) 512 ) == TaskCreationOptions . None ) )
92
+ {
93
+ tk . RunSynchronously ( scheduler ) ;
94
+ }
95
+ }
96
+ catch ( Exception ex )
97
+ {
98
+ Errors = ex . Message ;
99
+ if ( ! RaiseFaultHandlers ( ex ) )
100
+ throw ;
101
+ }
102
+ finally
103
+ {
104
+ RaiseOnEnd ( ) ;
105
+ }
106
+ } , task , Token , TaskCreationOptions . None ) ;
89
107
}
90
108
91
109
protected TaskBase ( ) { }
@@ -395,7 +413,33 @@ public TaskBase(CancellationToken token)
395
413
public TaskBase ( Task < TResult > task )
396
414
: base ( )
397
415
{
398
- Task = task ;
416
+ var scheduler = TaskManager . GetScheduler ( Affinity ) ;
417
+ Task = new Task < TResult > ( t =>
418
+ {
419
+ TResult ret = default ( TResult ) ;
420
+ RaiseOnStart ( ) ;
421
+ var tk = ( ( Task < TResult > ) t ) ;
422
+ try
423
+ {
424
+ if ( tk . Status == TaskStatus . Created && ! tk . IsCompleted &&
425
+ ( ( tk . CreationOptions & ( TaskCreationOptions ) 512 ) == TaskCreationOptions . None ) )
426
+ {
427
+ tk . RunSynchronously ( ) ;
428
+ }
429
+ ret = tk . Result ;
430
+ }
431
+ catch ( Exception ex )
432
+ {
433
+ Errors = ex . Message ;
434
+ if ( ! RaiseFaultHandlers ( ex ) )
435
+ throw ;
436
+ }
437
+ finally
438
+ {
439
+ RaiseOnEnd ( ) ;
440
+ }
441
+ return ret ;
442
+ } , task , Token , TaskCreationOptions . None ) ;
399
443
}
400
444
401
445
Original file line number Diff line number Diff line change @@ -656,15 +656,11 @@ class TaskToActionTask : BaseTest
656
656
[ Test ]
657
657
public async Task CanWrapATask ( )
658
658
{
659
- var uiThread = 0 ;
660
- await new ActionTask ( Token , _ => uiThread = Thread . CurrentThread . ManagedThreadId ) { Affinity = TaskAffinity . UI }
661
- . StartAsAsync ( ) ;
662
-
663
659
var runOrder = new List < string > ( ) ;
664
- var task = new Task ( ( ) => runOrder . Add ( $ "ran { Thread . CurrentThread . ManagedThreadId } ") ) ;
665
- var act = new ActionTask ( task ) { Affinity = TaskAffinity . UI } ;
660
+ var task = new Task ( ( ) => runOrder . Add ( $ "ran") ) ;
661
+ var act = new ActionTask ( task ) { Affinity = TaskAffinity . Exclusive } ;
666
662
await act . Start ( ) . Task ;
667
- CollectionAssert . AreEqual ( new string [ ] { $ "ran { uiThread } " } , runOrder ) ;
663
+ CollectionAssert . AreEqual ( new string [ ] { $ "ran" } , runOrder ) ;
668
664
}
669
665
670
666
/// <summary>
@@ -820,9 +816,10 @@ public TaskBase Test_GetTopMostTaskInCreatedState()
820
816
}
821
817
822
818
[ Test ]
823
- public void GetTopMostTaskInCreatedState ( )
819
+ public async Task GetTopMostTaskInCreatedState ( )
824
820
{
825
- var task1 = new ActionTask ( TaskEx . FromResult ( true ) ) ;
821
+ var task1 = new ActionTask ( Token , ( ) => { } ) ;
822
+ await task1 . StartAwait ( ) ;
826
823
var task2 = new TestActionTask ( Token , _ => { } ) ;
827
824
var task3 = new TestActionTask ( Token , _ => { } ) ;
828
825
Original file line number Diff line number Diff line change @@ -49,6 +49,7 @@ private void Wait(long id)
49
49
50
50
private void Start ( )
51
51
{
52
+ SetSynchronizationContext ( this ) ;
52
53
threadId = Thread . CurrentThread . ManagedThreadId ;
53
54
var lastTime = DateTime . Now . Ticks ;
54
55
var wait = new ManualResetEventSlim ( false ) ;
You can’t perform that action at this time.
0 commit comments