1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+ using System . Threading ;
5+ using System . Threading . Tasks ;
6+ using NUnit . Framework ;
7+
8+ namespace Shuttle . Core . Threading . Tests
9+ {
10+ [ TestFixture ]
11+ public class SharedCancellationTokenSourceFixture
12+ {
13+ private static readonly Random Random = new Random ( DateTime . Now . Millisecond ) ;
14+
15+ [ Test ]
16+ public void Should_be_able_to_shared_cancellation_token_source_entries ( )
17+ {
18+ using ( var cancellationTokenSource = new DefaultCancellationTokenSource ( ) )
19+ {
20+ Assert . That ( cancellationTokenSource . Get ( ) , Is . SameAs ( cancellationTokenSource . Get ( ) ) ) ;
21+
22+ var tasks = new List < Task >
23+ {
24+ Task . Run ( ( ) => Spin ( "A" , cancellationTokenSource . Get ( ) . Token ) ) ,
25+ Task . Run ( ( ) => Spin ( "B" , cancellationTokenSource . Get ( ) . Token ) ) ,
26+ Task . Run ( ( ) => Spin ( "C" , cancellationTokenSource . Get ( ) . Token ) ) ,
27+ Task . Run ( ( ) => Spin ( "D" , cancellationTokenSource . Get ( ) . Token ) )
28+ } ;
29+
30+ // wait for all the tasks to start
31+ while ( tasks . Any ( task => task . Status != TaskStatus . Running ) )
32+ {
33+ Thread . Sleep ( 100 ) ;
34+ }
35+
36+ cancellationTokenSource . Get ( ) . Cancel ( ) ;
37+
38+ Task . WaitAll ( tasks . ToArray ( ) ) ;
39+ }
40+ }
41+
42+ private void Spin ( string name , CancellationToken cancellationToken )
43+ {
44+ Log ( $@ "[starting] : { name } ") ;
45+
46+ while ( ! cancellationToken . IsCancellationRequested )
47+ {
48+ var timeout = Random . Next ( 5 , 20 ) * 100 ;
49+
50+ Log ( $@ "[sleeping] : { name } / timeout = { timeout } ") ;
51+
52+ Thread . Sleep ( timeout ) ;
53+ }
54+
55+ Log ( $@ "[ending] : { name } ") ;
56+ }
57+
58+ private void Log ( string message )
59+ {
60+ Console . WriteLine ( $@ "{ DateTime . Now : O} - { message } ") ;
61+ }
62+ }
63+ }
0 commit comments