Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Register()

CancellationTokenRegistration System.Threading.CancellationTokenSource.Register ( Delegate callback,
object stateForCallback,
SynchronizationContext syncContext,
ExecutionContext executionContext )
inlinepackageinherited

Definition at line 480 of file CancellationTokenSource.cs.

481 {
483 {
484 if (_disposed)
485 {
486 return default(CancellationTokenRegistration);
487 }
488 Registrations registrations = Volatile.Read(ref _registrations);
489 if (registrations == null)
490 {
491 registrations = new Registrations(this);
492 registrations = Interlocked.CompareExchange(ref _registrations, registrations, null) ?? registrations;
493 }
494 CallbackNode callbackNode = null;
495 long id = 0L;
496 if (registrations.FreeNodeList != null)
497 {
498 registrations.EnterLock();
499 try
500 {
501 callbackNode = registrations.FreeNodeList;
502 if (callbackNode != null)
503 {
504 registrations.FreeNodeList = callbackNode.Next;
505 id = (callbackNode.Id = registrations.NextAvailableId++);
506 callbackNode.Callback = callback;
507 callbackNode.CallbackState = stateForCallback;
508 callbackNode.ExecutionContext = executionContext;
509 callbackNode.SynchronizationContext = syncContext;
510 callbackNode.Next = registrations.Callbacks;
511 registrations.Callbacks = callbackNode;
512 if (callbackNode.Next != null)
513 {
514 callbackNode.Next.Prev = callbackNode;
515 }
516 }
517 }
518 finally
519 {
520 registrations.ExitLock();
521 }
522 }
523 if (callbackNode == null)
524 {
525 callbackNode = new CallbackNode(registrations);
526 callbackNode.Callback = callback;
527 callbackNode.CallbackState = stateForCallback;
528 callbackNode.ExecutionContext = executionContext;
529 callbackNode.SynchronizationContext = syncContext;
530 registrations.EnterLock();
531 try
532 {
533 id = (callbackNode.Id = registrations.NextAvailableId++);
534 callbackNode.Next = registrations.Callbacks;
535 if (callbackNode.Next != null)
536 {
537 callbackNode.Next.Prev = callbackNode;
538 }
539 registrations.Callbacks = callbackNode;
540 }
541 finally
542 {
543 registrations.ExitLock();
544 }
545 }
546 if (!IsCancellationRequested || !registrations.Unregister(id, callbackNode))
547 {
548 return new CancellationTokenRegistration(id, callbackNode);
549 }
550 }
551 Invoke(callback, stateForCallback, this);
552 return default(CancellationTokenRegistration);
553 }
static void Invoke(Delegate d, object state, CancellationTokenSource source)

References System.Threading.CancellationTokenSource._disposed, System.Threading.CancellationTokenSource._registrations, System.Threading.Interlocked.CompareExchange(), System.Threading.CancellationTokenSource.Invoke(), System.Threading.CancellationTokenSource.IsCancellationRequested, System.L, and System.Threading.Volatile.Read().

Referenced by System.Threading.CancellationToken.Register().