Dreamine.Threading
1.0.1
이 패키지는 .NET ThreadPool이나 Task Parallel Library를 대체하려는 목적이 아닙니다.
Toggle main menu visibility
로딩중...
검색중...
일치하는것 없음
DreamineThread.cs
이 파일의 문서화 페이지로 가기
1
using
Dreamine.Logging.Interfaces;
2
using
Dreamine.Threading.Interfaces
;
3
using
Dreamine.Threading.Models
;
4
5
namespace
Dreamine.Threading.Services
;
6
15
public
sealed
class
DreamineThread
:
IDreamineThread
16
{
25
private
readonly
object
_syncRoot
=
new
();
34
private
readonly List<IDreamineThreadJob>
_jobs
=
new
();
43
private
readonly
IThreadCyclePolicy
_cyclePolicy
;
52
private
readonly
IThreadAffinityService
?
_affinityService
;
61
private
readonly
ITimerResolutionService
?
_timerResolutionService
;
70
private
readonly IDreamineLogger?
_logger
;
79
private
readonly ManualResetEventSlim
_pauseEvent
=
new
(
true
);
80
89
private
Thread?
_thread
;
98
private
CancellationTokenSource?
_cancellationTokenSource
;
107
private
long
_cycleCount
;
116
private
DateTimeOffset?
_startedAt
;
125
private
DateTimeOffset?
_stoppedAt
;
134
private
string
?
_lastErrorMessage
;
143
private
bool
_disposed
;
144
153
public
string
Name
{
get
; }
154
163
public
DreamineThreadOptions
Options
{
get
; }
164
173
public
DreamineThreadCoreAssignment
CoreAssignment
{
get
; }
174
183
private
volatile
DreamineThreadStatus
_status
=
DreamineThreadStatus
.Created;
184
193
public
DreamineThreadStatus
Status
194
{
195
get
=>
_status
;
196
private
set
=>
_status
= value;
197
}
198
207
public
int
JobCount
208
{
209
get
210
{
211
lock (
_syncRoot
)
212
{
213
return
_jobs
.Count;
214
}
215
}
216
}
217
282
public
DreamineThread
(
283
DreamineThreadOptions
options,
284
DreamineThreadCoreAssignment
coreAssignment,
285
IThreadCyclePolicy
cyclePolicy,
286
IThreadAffinityService
? affinityService =
null
,
287
ITimerResolutionService
? timerResolutionService =
null
,
288
IDreamineLogger? logger =
null
)
289
{
290
ArgumentNullException.ThrowIfNull(options);
291
ArgumentNullException.ThrowIfNull(coreAssignment);
292
ArgumentNullException.ThrowIfNull(cyclePolicy);
293
294
Options
= options.
Normalize
();
295
Name
=
Options
.Name;
296
CoreAssignment
= coreAssignment;
297
_cyclePolicy
= cyclePolicy;
298
_affinityService
= affinityService;
299
_timerResolutionService
= timerResolutionService;
300
_logger
= logger;
301
}
302
335
public
void
AddJob
(
IDreamineThreadJob
job)
336
{
337
ArgumentNullException.ThrowIfNull(job);
338
339
lock (
_syncRoot
)
340
{
341
ThrowIfDisposed
();
342
_jobs
.Add(job);
343
}
344
}
345
370
public
void
Start
()
371
{
372
Thread? threadToStart =
null
;
373
374
lock (
_syncRoot
)
375
{
376
ThrowIfDisposed
();
377
378
if
(
Status
==
DreamineThreadStatus
.Running)
379
{
380
return
;
381
}
382
383
_cancellationTokenSource
=
new
CancellationTokenSource();
384
_pauseEvent
.Set();
385
386
_thread
=
new
Thread(() =>
Run
(
_cancellationTokenSource
.Token))
387
{
388
IsBackground =
true
,
389
Name
=
Name
,
390
Priority =
MapPriority
(
Options
.Priority)
391
};
392
393
Status
=
DreamineThreadStatus
.Running;
394
_startedAt
= DateTimeOffset.Now;
395
_stoppedAt
=
null
;
396
_lastErrorMessage
=
null
;
397
398
threadToStart =
_thread
;
399
}
400
401
// Start the thread outside the lock so that any logging or scheduling
402
// callbacks triggered by the OS during startup cannot deadlock against
403
// the lock held by callers like the manager.
404
threadToStart?.Start();
405
406
_logger
?.Info($
"Thread started. Name={Name}"
);
407
}
408
417
public
void
Pause
()
418
{
419
bool
transitioned;
420
421
lock (
_syncRoot
)
422
{
423
if
(
Status
!=
DreamineThreadStatus
.Running)
424
{
425
transitioned =
false
;
426
}
427
else
428
{
429
_pauseEvent
.Reset();
430
Status
=
DreamineThreadStatus
.Paused;
431
transitioned =
true
;
432
}
433
}
434
435
if
(transitioned)
436
{
437
_logger
?.Info($
"Thread paused. Name={Name}"
);
438
}
439
}
440
449
public
void
Resume
()
450
{
451
bool
transitioned;
452
453
lock (
_syncRoot
)
454
{
455
if
(
Status
!=
DreamineThreadStatus
.Paused)
456
{
457
transitioned =
false
;
458
}
459
else
460
{
461
_pauseEvent
.Set();
462
Status
=
DreamineThreadStatus
.Running;
463
transitioned =
true
;
464
}
465
}
466
467
if
(transitioned)
468
{
469
_logger
?.Info($
"Thread resumed. Name={Name}"
);
470
}
471
}
472
489
[Obsolete(
"Stop() blocks the calling thread and risks deadlock on a SynchronizationContext. Use StopAsync() instead. / 호출 스레드를 블로킹하며 SynchronizationContext 환경에서 데드락 위험이 있습니다. StopAsync()를 사용하세요."
)]
490
public
void
Stop
()
491
{
492
StopAsync
().AsTask().GetAwaiter().GetResult();
493
}
494
519
public
async ValueTask
StopAsync
()
520
{
521
Thread? threadToJoin;
522
523
lock (
_syncRoot
)
524
{
525
if
(
Status
is
DreamineThreadStatus
.Stopped or
DreamineThreadStatus
.Disposed)
526
{
527
return
;
528
}
529
530
Status
=
DreamineThreadStatus
.Stopping;
531
_pauseEvent
.Set();
532
533
_cancellationTokenSource
?.Cancel();
534
threadToJoin =
_thread
;
535
}
536
537
if
(threadToJoin is not
null
&& threadToJoin.IsAlive)
538
{
539
await Task.Run(
540
() => threadToJoin.Join(
Options
.StopTimeout))
541
.ConfigureAwait(
false
);
542
}
543
544
lock (
_syncRoot
)
545
{
546
_cancellationTokenSource
?.Dispose();
547
_cancellationTokenSource
=
null
;
548
_thread
=
null
;
549
550
if
(
Status
!=
DreamineThreadStatus
.Faulted)
551
{
552
Status
=
DreamineThreadStatus
.Stopped;
553
}
554
555
_stoppedAt
= DateTimeOffset.Now;
556
}
557
558
_logger
?.Info($
"Thread stopped. Name={Name}"
);
559
}
560
577
public
DreamineThreadInfo
GetInfo
()
578
{
579
return
new
DreamineThreadInfo
(
580
Name
,
581
Status
,
582
Options
.Priority,
583
Options
.IntervalMs,
584
CoreAssignment
.CoreIndex,
585
CoreAssignment
.UseAffinity,
586
JobCount
,
587
Interlocked.Read(ref
_cycleCount
),
588
_startedAt
,
589
_stoppedAt
,
590
_lastErrorMessage
);
591
}
592
609
public
void
Dispose
()
610
{
611
if
(
_disposed
)
612
{
613
return
;
614
}
615
616
StopAsync
().AsTask().GetAwaiter().GetResult();
617
618
_pauseEvent
.Dispose();
619
_disposed
=
true
;
620
Status
=
DreamineThreadStatus
.Disposed;
621
}
622
647
private
void
Run
(CancellationToken cancellationToken)
648
{
649
try
650
{
651
if
(
Options
.UseHighPrecisionTimer)
652
{
653
_timerResolutionService
?.Begin();
654
}
655
656
if
(
CoreAssignment
.UseAffinity &&
CoreAssignment
.CoreIndex is not
null
)
657
{
658
_affinityService
?.ApplyToCurrentThread(
CoreAssignment
.CoreIndex.Value);
659
}
660
661
while
(!cancellationToken.IsCancellationRequested)
662
{
663
_pauseEvent
.Wait(cancellationToken);
664
665
ExecuteDueJobs
(cancellationToken);
666
667
Interlocked.Increment(ref
_cycleCount
);
668
669
var context =
new
DreamineThreadCycleContext
(
670
Name
,
671
Interlocked.Read(ref
_cycleCount
),
672
JobCount
,
673
CoreAssignment
.CoreIndex,
674
CoreAssignment
.IsOverflowPolling,
675
DateTimeOffset.Now);
676
677
var delayMs =
_cyclePolicy
.GetDelayMs(
678
Options
,
679
CoreAssignment
,
680
context);
681
682
if
(delayMs > 0)
683
{
684
cancellationToken.WaitHandle.WaitOne(delayMs);
685
}
686
else
if
(
Options
.YieldWhenIntervalIsZero)
687
{
688
Thread.Yield();
689
}
690
}
691
}
692
catch
(OperationCanceledException)
693
{
694
// Normal stop path.
695
}
696
catch
(Exception ex)
697
{
698
_lastErrorMessage
= ex.Message;
699
Status
=
DreamineThreadStatus
.Faulted;
700
_logger
?.Error(ex, $
"Thread faulted. Name={Name}"
);
701
}
702
finally
703
{
704
if
(
Options
.UseHighPrecisionTimer)
705
{
706
_timerResolutionService
?.End();
707
}
708
709
if
(
CoreAssignment
.UseAffinity)
710
{
711
_affinityService
?.ClearCurrentThreadAffinity();
712
}
713
}
714
}
715
748
private
void
ExecuteDueJobs
(CancellationToken cancellationToken)
749
{
750
IDreamineThreadJob
[] jobs;
751
752
lock (
_syncRoot
)
753
{
754
jobs =
_jobs
.ToArray();
755
}
756
757
var now = DateTimeOffset.Now;
758
759
foreach
(var job
in
jobs)
760
{
761
if
(!job.ShouldRun(now))
762
{
763
continue
;
764
}
765
766
try
767
{
768
// Jobs run on a dedicated worker thread. Blocking here is
769
// intentional so jobs preserve registration order and the cycle
770
// policy observes completed work before calculating the next delay.
771
job.ExecuteAsync(cancellationToken).GetAwaiter().GetResult();
772
}
773
catch
(OperationCanceledException)
774
{
775
throw
;
776
}
777
catch
(Exception ex)
778
{
779
_lastErrorMessage
= ex.Message;
780
_logger
?.Error(ex, $
"Thread job failed. Thread={Name}, Job={job.Name}"
);
781
}
782
}
783
}
784
809
private
static
ThreadPriority
MapPriority
(
DreamineThreadPriority
priority)
810
{
811
return
priority
switch
812
{
813
DreamineThreadPriority.High
=> ThreadPriority.AboveNormal,
814
DreamineThreadPriority.Low
=> ThreadPriority.BelowNormal,
815
_ => ThreadPriority.Normal
816
};
817
}
818
835
private
void
ThrowIfDisposed
()
836
{
837
if
(
_disposed
)
838
{
839
throw
new
ObjectDisposedException(nameof(
DreamineThread
));
840
}
841
}
842
}
Dreamine.Threading.Interfaces
Definition
ICpuInfoProvider.cs:1
Dreamine.Threading.Models
Definition
DreamineThreadCoreAssignment.cs:1
Dreamine.Threading.Models.DreamineThreadStatus
DreamineThreadStatus
Definition
DreamineThreadStatus.cs:12
Dreamine.Threading.Models.DreamineThreadPriority
DreamineThreadPriority
Definition
DreamineThreadPriority.cs:12
Dreamine.Threading.Models.DreamineThreadPriority.Low
@ Low
Definition
DreamineThreadPriority.cs:21
Dreamine.Threading.Models.DreamineThreadPriority.High
@ High
Definition
DreamineThreadPriority.cs:41
Dreamine.Threading.Services
Definition
DreamineThread.cs:5
Dreamine.Threading.Interfaces.IDreamineThread
Definition
IDreamineThread.cs:14
Dreamine.Threading.Interfaces.IDreamineThreadJob
Definition
IDreamineThreadJob.cs:14
Dreamine.Threading.Interfaces.IThreadAffinityService
Definition
IThreadAffinityService.cs:12
Dreamine.Threading.Interfaces.IThreadCyclePolicy
Definition
IThreadCyclePolicy.cs:14
Dreamine.Threading.Interfaces.ITimerResolutionService
Definition
ITimerResolutionService.cs:12
Dreamine.Threading.Models.DreamineThreadCoreAssignment
Definition
DreamineThreadCoreAssignment.cs:12
Dreamine.Threading.Models.DreamineThreadCycleContext
Definition
DreamineThreadCycleContext.cs:12
Dreamine.Threading.Models.DreamineThreadInfo
Definition
DreamineThreadInfo.cs:12
Dreamine.Threading.Models.DreamineThreadOptions
Definition
DreamineThreadOptions.cs:12
Dreamine.Threading.Models.DreamineThreadOptions.Normalize
DreamineThreadOptions Normalize()
Definition
DreamineThreadOptions.cs:149
Dreamine.Threading.Services.DreamineThread.DreamineThread
DreamineThread(DreamineThreadOptions options, DreamineThreadCoreAssignment coreAssignment, IThreadCyclePolicy cyclePolicy, IThreadAffinityService? affinityService=null, ITimerResolutionService? timerResolutionService=null, IDreamineLogger? logger=null)
Definition
DreamineThread.cs:282
Dreamine.Threading.Services.DreamineThread.Pause
void Pause()
Definition
DreamineThread.cs:417
Dreamine.Threading.Services.DreamineThread.Status
DreamineThreadStatus Status
Definition
DreamineThread.cs:194
Dreamine.Threading.Services.DreamineThread._lastErrorMessage
string? _lastErrorMessage
Definition
DreamineThread.cs:134
Dreamine.Threading.Services.DreamineThread.Stop
void Stop()
Definition
DreamineThread.cs:490
Dreamine.Threading.Services.DreamineThread.GetInfo
DreamineThreadInfo GetInfo()
Definition
DreamineThread.cs:577
Dreamine.Threading.Services.DreamineThread._cyclePolicy
readonly IThreadCyclePolicy _cyclePolicy
Definition
DreamineThread.cs:43
Dreamine.Threading.Services.DreamineThread.StopAsync
async ValueTask StopAsync()
Definition
DreamineThread.cs:519
Dreamine.Threading.Services.DreamineThread.Run
void Run(CancellationToken cancellationToken)
Definition
DreamineThread.cs:647
Dreamine.Threading.Services.DreamineThread.CoreAssignment
DreamineThreadCoreAssignment CoreAssignment
Definition
DreamineThread.cs:173
Dreamine.Threading.Services.DreamineThread._jobs
readonly List< IDreamineThreadJob > _jobs
Definition
DreamineThread.cs:34
Dreamine.Threading.Services.DreamineThread.JobCount
int JobCount
Definition
DreamineThread.cs:208
Dreamine.Threading.Services.DreamineThread._thread
Thread? _thread
Definition
DreamineThread.cs:89
Dreamine.Threading.Services.DreamineThread.Resume
void Resume()
Definition
DreamineThread.cs:449
Dreamine.Threading.Services.DreamineThread.Start
void Start()
Definition
DreamineThread.cs:370
Dreamine.Threading.Services.DreamineThread._logger
readonly? IDreamineLogger _logger
Definition
DreamineThread.cs:70
Dreamine.Threading.Services.DreamineThread.ThrowIfDisposed
void ThrowIfDisposed()
Definition
DreamineThread.cs:835
Dreamine.Threading.Services.DreamineThread._cycleCount
long _cycleCount
Definition
DreamineThread.cs:107
Dreamine.Threading.Services.DreamineThread._affinityService
readonly? IThreadAffinityService _affinityService
Definition
DreamineThread.cs:52
Dreamine.Threading.Services.DreamineThread._disposed
bool _disposed
Definition
DreamineThread.cs:143
Dreamine.Threading.Services.DreamineThread._syncRoot
readonly object _syncRoot
Definition
DreamineThread.cs:25
Dreamine.Threading.Services.DreamineThread._startedAt
DateTimeOffset? _startedAt
Definition
DreamineThread.cs:116
Dreamine.Threading.Services.DreamineThread.MapPriority
static ThreadPriority MapPriority(DreamineThreadPriority priority)
Definition
DreamineThread.cs:809
Dreamine.Threading.Services.DreamineThread.Options
DreamineThreadOptions Options
Definition
DreamineThread.cs:163
Dreamine.Threading.Services.DreamineThread.ExecuteDueJobs
void ExecuteDueJobs(CancellationToken cancellationToken)
Definition
DreamineThread.cs:748
Dreamine.Threading.Services.DreamineThread._cancellationTokenSource
CancellationTokenSource? _cancellationTokenSource
Definition
DreamineThread.cs:98
Dreamine.Threading.Services.DreamineThread.AddJob
void AddJob(IDreamineThreadJob job)
Definition
DreamineThread.cs:335
Dreamine.Threading.Services.DreamineThread._status
volatile DreamineThreadStatus _status
Definition
DreamineThread.cs:183
Dreamine.Threading.Services.DreamineThread._pauseEvent
readonly ManualResetEventSlim _pauseEvent
Definition
DreamineThread.cs:79
Dreamine.Threading.Services.DreamineThread.Name
string Name
Definition
DreamineThread.cs:153
Dreamine.Threading.Services.DreamineThread._timerResolutionService
readonly? ITimerResolutionService _timerResolutionService
Definition
DreamineThread.cs:61
Dreamine.Threading.Services.DreamineThread._stoppedAt
DateTimeOffset? _stoppedAt
Definition
DreamineThread.cs:125
Dreamine.Threading.Services.DreamineThread.Dispose
void Dispose()
Definition
DreamineThread.cs:609
Services
DreamineThread.cs
다음에 의해 생성됨 :
1.17.0