Down the Concurrency Rabbit Hole
For a client a while ago we had to build a program to ingest the Opera options feed. The wire format was fairly compact and spiked up 8 gigabits per second, and spikes well over 10m messages a second. We needed to process and pass on messages to different components. The new Dotnet Async Pipelines seemed like a good fit for this, but it was too slow. Mailbox processors were to slow. I ended up writing a abstraction over a dedicated thread that has served me well over a number or projects since.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: |
module ActorStatus = [<Literal>] let Idle = 0L [<Literal>] let Occupied = 1L [<Literal>] let Stopped = 2L /// <summary> An actor pulls a message off of a (thread-safe) queue and executes it in the isolated context of the actor. </summary> /// <typeparam name = "tmsg"> the type of messages that this actor will manage </typeparam> /// <param name = "bodyFn"> the function to execute when the thread is available </param> type ThreadedActor<'tmsg>(bodyFn: 'tmsg * ThreadedActor<'tmsg> -> unit) as this = let mutable status: int64 = ActorStatus.Idle //Do not expose these let signal = new ManualResetEventSlim(false) let queue = ConcurrentQueue<'tmsg>() let mutable count = 0 // This is the main thread function (delegate). It gets executed when the thread is started/signaled let threadFn () = // While the actor is not stopped, check the queue and process any awaiting messages while Interlocked.Read(&status) <> ActorStatus.Stopped do while not queue.IsEmpty do //assert(queue.Count = Threading.Volatile.Read(&count)) race condition // If the thread is idle, update it to 'occupied' Interlocked.CompareExchange(&status, ActorStatus.Occupied, ActorStatus.Idle) |> ignore // Try to get the next message in the queue let isSuccessful, message = queue.TryDequeue() // If we successfully retrieved the next message, execute it in the context of this thread if isSuccessful then bodyFn (message, this) if Threading.Interlocked.Decrement(&count) = 0 then signal.Reset() // If the thread is 'occupied', mark it as idle Interlocked.CompareExchange(&status, ActorStatus.Idle, ActorStatus.Occupied) |> ignore if Interlocked.Read(&status) <> ActorStatus.Stopped then signal.Wait() // If the thread is stopped, dispose of it signal.Dispose() // The thread associated with this actor (one-to-one relationship) // Pass the threadFn delegate to the constructor let thread = Thread(ThreadStart(threadFn), IsBackground = true, Name = "ActorThread") // Start the thread do thread.Start() /// Enqueue a new messages for the thread to pick up and execute member this.Enqueue(msg: 'tmsg) = if Interlocked.Read(&status) <> ActorStatus.Stopped then queue.Enqueue(msg) if Threading.Interlocked.Increment(&count) = 1 then signal.Set() else failwith "Cannot queue to stopped actor." // Get the length of the actor's message queue member this.QueueCount = queue.Count // Stops the actor member this.Stop() = Interlocked.Exchange(&status, ActorStatus.Stopped) |> ignore signal.Set() interface IDisposable with member __.Dispose() = this.Stop() thread.Join() |
However, recently I've been working on a project has a bit more complex processing pipeline; I thought that the number of threads and different messages types could be come problem. I began look at different approaches. I learned that interlocked commands are not cheap cpu instructions as they take a full cpu cycle where a lot of other instructions can be compacted into a single cpu cycle.
Method | Messages | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Completed Work Items | Lock Contentions | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|---|---|---|---|
Hammer | 100000 | 1.525 ms | 0.0926 ms | 0.2730 ms | 0.05 | 0.01 | - | - | - | 2 MB | 0.04 |
Payload | 100000 | 6.702 ms | 0.1874 ms | 0.5408 ms | 0.24 | 0.02 | - | - | - | 2 MB | 0.04 |
ThreadedActor | 100000 | 11.309 ms | 0.2252 ms | 0.4118 ms | 0.38 | 0.02 | - | - | - | 5.06 MB | 0.09 |
ThreadedActor3 | 100000 | 6.029 ms | 0.1201 ms | 0.3100 ms | 0.21 | 0.01 | - | - | 3.0000 | 2 MB | 0.04 |
MailBoxProcessor | 100000 | 29.356 ms | 0.5870 ms | 1.4288 ms | 1.00 | 0.00 | 6000.0000 | 1.0000 | 100.0000 | 56.26 MB | 1.00 |
The Internal compute payload is the Payload time - Hammer time thus (6.702 - 1.525 = 5.177 ms). The payload is a simple sum aggregation over thousand ints, this minimal compute work to get the metrics at the high frequency use case without making it into a memory benchmark. The Hammer is another thread that sends 100k messages to the actor as fast as it can which is (1.525ms).Which means that the ThreadedActor3 overhead is 6.029 - 5.177 = 0.852 ms for a 100k messages compared to TheadedActor overhead of 11.309 - 5.177 = 6.132 ms for a 100k messages, a 7.2x improvement.And a 29.356 - 5.177 = 24.179 ms for a 100k messages for MailBoxProcessor, a 28.3x improvement. What changed in ThreadedActor3? Use a spinwait before yielding thread with the reset event and secondly removing all Interlocked commands.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: |
type ThreadedActor3<'tmsg>(bodyFn: 'tmsg -> unit, ct : CancellationToken ) as this = let queue = ConcurrentQueue<'tmsg>() let signal = new ManualResetEventSlim(false,1000) //avoids spin let threadFn () = while not <| ct.IsCancellationRequested do let isSuccessful, message = queue.TryDequeue() // If we successfully retrieved the next message, execute it in the context of this thread if isSuccessful then bodyFn message else signal.Reset() if queue.IsEmpty && (not <| ct.IsCancellationRequested) then signal.Wait() signal.Dispose() let thread = Thread(ThreadStart(threadFn), IsBackground = true, Name = "ActorThread") do thread.Start() member this.Enqueue(msg: 'tmsg) = queue.Enqueue(msg) if not <| signal.IsSet then signal.Set() member this.QueueCount = queue.Count interface IDisposable with member __.Dispose() = thread.Join() |
What more could be done. I thought surely this approach won't scale. I want to put together a benchmark that would surely show that at some point it would be more efficient to run on the thread pool through async or tasks.
Method | Threads | Messages | Payload | Mean | Error | StdDev | Median | Ratio | RatioSD | Completed Work Items | Lock Contentions | Gen0 | Gen1 | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ThreadedActor3 | 100 | 100000 | 100 | 275.406 ms | 10.3832 ms | 6.8678 ms | 273.359 ms | 1.00 | 0.00 | - | - | - | - | 843.91 KB | 1.00 |
MailBoxProcessor | 100 | 100000 | 100 | 5,587.295 ms | 64.6290 ms | 42.7481 ms | 5,600.417 ms | 20.30 | 0.50 | 9920532.0000 | 836.0000 | 1171000.0000 | 1000.0000 | 9499865.83 KB | 11,256.91 |
OK... I didn't expect that. 100 Threads, I thought context switching was supposed to be expensive. There might be several factors to this, one is the simplicity of the execution context of the thread, minimal loop and no significant working memory to cycle into the cpu cache. Since I was caught of guard by this one, I don't think my speculations are worth much in regard to this.
One thing that was obvious was the allocation the mailbox processors were doing was excessive. Async is known to have less performance than tasks, so how would a similar workflow be fixed up with tasks. Conveniently there are System.Threading.Channels.
Method | T | N | P | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Completed Work Items | Lock Contentions | Gen1 | Gen2 | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ThreadedActor3 | 1 | 100000 | False | 5.894 ms | 1.155 ms | 0.7637 ms | 1.00 | 0.00 | - | - | 2.0000 | - | - | 2051.88 KB | 1.00 |
Channel | 1 | 100000 | False | 11.862 ms | 1.695 ms | 1.1215 ms | 2.04 | 0.32 | - | 1.0000 | - | - | - | 2052.4 KB | 1.00 |
ThreadedActor3 | 1 | 100000 | True | 49.052 ms | 9.460 ms | 6.2569 ms | 1.00 | 0.00 | 2000.0000 | - | 1.0000 | - | - | 19239.2 KB | 1.00 |
Channel | 1 | 100000 | True | 52.764 ms | 8.348 ms | 5.5220 ms | 1.10 | 0.21 | 2000.0000 | 1.0000 | - | - | - | 19239.73 KB | 1.00 |
ThreadedActor3 | 20 | 100000 | False | 102.835 ms | 5.534 ms | 3.6603 ms | 1.00 | 0.00 | - | - | 1.0000 | - | - | 422.17 KB | 1.00 |
Channel | 20 | 100000 | False | 866.496 ms | 51.184 ms | 33.8551 ms | 8.44 | 0.44 | - | 1958891.0000 | 12.0000 | - | - | 116.91 KB | 0.28 |
ThreadedActor3 | 20 | 100000 | True | 170.972 ms | 14.906 ms | 9.8591 ms | 1.00 | 0.00 | 42000.0000 | - | - | 1000.0000 | - | 384770.88 KB | 1.00 |
Channel | 20 | 100000 | True | 773.445 ms | 28.016 ms | 18.5307 ms | 4.54 | 0.32 | 42000.0000 | 1790185.0000 | 12.0000 | 1000.0000 | - | 344117.42 KB | 0.89 |
ThreadedActor3 | 100 | 100000 | False | 269.136 ms | 8.376 ms | 5.5399 ms | 1.00 | 0.00 | - | - | 2.0000 | - | - | 833.09 KB | 1.00 |
Channel | 100 | 100000 | False | 3,844.147 ms | 49.555 ms | 32.7776 ms | 14.29 | 0.32 | - | 9970796.0000 | 14.0000 | - | - | 278.78 KB | 0.33 |
ThreadedActor3 | 100 | 100000 | True | 1,432.064 ms | 341.260 ms | 225.7225 ms | 1.00 | 0.00 | 214000.0000 | - | 1.0000 | 2000.0000 | - | 1897220.5 KB | 1.00 |
Channel | 100 | 100000 | True | 1,135.409 ms | 677.421 ms | 448.0719 ms | 0.79 | 0.30 | 216000.0000 | 2064.0000 | 4.0000 | 8000.0000 | 2000.0000 | 1821499.04 KB | 0.96 |
Here P represents whether it is computing sha512 hash or just a sum. When does the context switching outway the cost of async. Not till 100 threads with the larger compute payload. Or was something else going on here, looks like the jit found an optimization path reducing the completed work itmms, which we would expected to be close to 10 million like on the lower compute version. But it still looks like the hash compute still work correctly because the allocation is pretty similar to the thread. So the obvious solution to increasing efficient use of the thread pool through tasks is with a larger compute payload, thus mini batching may be the way to go. However, too large of batches could clog the thread pool increasing latency to the rest of the system utilizing the thread pool. Spawning a 100 threads could also do that to the rest of he system.
So far the examples have been with unbounded queues, what if we used bounded queues and see if adding a back pressure mechanism makes a difference.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: |
type ThreadedActor4<'tmsg>(bodyFn: 'tmsg -> unit, qDepth : uint64, ct : CancellationToken ) as this = let queue = ConcurrentQueue<'tmsg>() let signal = new ManualResetEventSlim(false,1000) //avoids spin let rsignal = new ManualResetEventSlim(false,1000) //throttles let threadFn () = while not <| ct.IsCancellationRequested do let isSuccessful, message = queue.TryDequeue() if isSuccessful then bodyFn message else signal.Reset() if uint64 queue.Count <= qDepth && (not rsignal.IsSet) then rsignal.Set() if queue.IsEmpty && (not <| ct.IsCancellationRequested) then signal.Wait() signal.Dispose() let thread = Thread(ThreadStart(threadFn), IsBackground = true, Name = "ActorThread") do thread.Start() member this.Enqueue(msg: 'tmsg) = if uint64 queue.Count < qDepth then queue.Enqueue(msg) if not <| signal.IsSet then signal.Set() else rsignal.Reset() if uint64 queue.Count >= qDepth then rsignal.Wait() //blocking throttle queue.Enqueue(msg) member this.QueueCount = queue.Count interface IDisposable with member __.Dispose() = thread.Join() |
This version adds a second ManuelResetEventSlim to create a wait at the enqueue if the queue exceeds its defined bounds. BEWARE of this code though it went through several iterations of subtle race condition bugs before it ran stably enough to pass the benchmark. What can happen is that a lot can happen between the condition to trigger a wait and the wait; putting it into a bad state where both are waiting in which case they will never be unstuck. Adding the spins to the ManuelResetEventSlim helped a lot, also thinking about how to recover from an unfortunate race condition.
Method | T | N | P | Mean | Error | StdDev | Median | Ratio | RatioSD | Gen0 | Completed Work Items | Lock Contentions | Gen1 | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ThreadedActor4 | 1 | 100000 | False | 13.20 ms | 0.319 ms | 0.211 ms | 13.23 ms | 1.00 | 0.00 | - | - | - | - | 5.73 KB | 1.00 |
Channel | 1 | 100000 | False | 23.86 ms | 4.300 ms | 2.844 ms | 23.61 ms | 1.81 | 0.22 | - | 10512.0000 | 1.0000 | - | 892.59 KB | 155.87 |
ThreadedActor4 | 1 | 100000 | True | 56.45 ms | 10.095 ms | 6.677 ms | 54.00 ms | 1.00 | 0.00 | 2000.0000 | - | - | - | 17193.05 KB | 1.00 |
Channel | 1 | 100000 | True | 74.40 ms | 14.239 ms | 9.418 ms | 72.67 ms | 1.32 | 0.13 | 2000.0000 | 73682.0000 | 2.0000 | - | 22973.02 KB | 1.34 |
ThreadedActor4 | 15 | 100000 | False | 40.93 ms | 5.924 ms | 3.919 ms | 41.67 ms | 1.00 | 0.00 | - | - | 4.0000 | - | 75.88 KB | 1.00 |
Channel | 15 | 100000 | False | 71.77 ms | 51.068 ms | 33.778 ms | 53.28 ms | 1.81 | 0.94 | - | 66489.0000 | 25.0000 | - | 4557.92 KB | 60.07 |
ThreadedActor4 | 15 | 100000 | True | 153.95 ms | 14.809 ms | 9.795 ms | 154.46 ms | 1.00 | 0.00 | 31000.0000 | - | 17.0000 | - | 257885.78 KB | 1.00 |
Channel | 15 | 100000 | True | 136.68 ms | 10.014 ms | 6.624 ms | 135.38 ms | 0.89 | 0.06 | 33000.0000 | 170032.0000 | 10.0000 | - | 271112.13 KB | 1.05 |
ThreadedActor4 | 30 | 100000 | False | 68.97 ms | 9.827 ms | 6.500 ms | 71.24 ms | 1.00 | 0.00 | - | - | 1.0000 | - | 151.33 KB | 1.00 |
Channel | 30 | 100000 | False | 73.10 ms | 37.890 ms | 25.062 ms | 65.95 ms | 1.07 | 0.37 | - | 87009.0000 | 22.0000 | - | 4806.56 KB | 31.76 |
ThreadedActor4 | 30 | 100000 | True | 299.31 ms | 25.703 ms | 17.001 ms | 299.14 ms | 1.00 | 0.00 | 64000.0000 | - | 30.0000 | - | 515771.48 KB | 1.00 |
Channel | 30 | 100000 | True | 237.35 ms | 15.009 ms | 9.927 ms | 239.31 ms | 0.80 | 0.07 | 65000.0000 | 76520.0000 | 48.0000 | 1000.0000 | 520281.57 KB | 1.01 |
This benchmark was run with a the BoundedChannel and ThreadedActor4 both bound to 100 which is a bit low for a realistic workload. One pattern is seen is the Channel version doesn't handle the low workload all that well, but is able to perform really well when saturating the cpu.
How do Channels work? The key ingredient that makes it go burr is called IValueTaskSource which allows (only in few cases) the internal wait structure of tasks to be reused in a new value task where as with tasks a new task would have to be allocated for every 'loop'.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: |
type ResettableValueTaskSource(cancellationToken : CancellationToken) as this = let mutable _waitSource = ManualResetValueTaskSourceCore<bool>() do _waitSource.RunContinuationsAsynchronously <- false let mutable _waitSourceCancellation = cancellationToken.UnsafeRegister((fun x -> (x :?> ResettableValueTaskSource).CancelWaiter(cancellationToken)), this) let mutable _hasWaiter = 0 member this.SignalWaiter() = if Interlocked.Exchange(&_hasWaiter, 0) = 1 then _waitSource.SetResult(true) () member private this.CancelWaiter(cancellationToken : CancellationToken) = if Interlocked.Exchange(&_hasWaiter, 0) = 1 then _waitSource.SetException (ExceptionDispatchInfo.SetCurrentStackTrace (new OperationCanceledException(cancellationToken))) () member this.WaitAsync() = if _hasWaiter <> 0 then raise (new InvalidOperationException("Concurrent use is not supported") :> System.Exception) _waitSource.Reset () Volatile.Write(&_hasWaiter, 1) new ValueTask(this :> IValueTaskSource, _waitSource.Version) interface IValueTaskSource with member this.GetResult(token : int16) = _waitSource.GetResult (token) |> ignore member this.GetStatus(token : int16) = (_waitSource.GetStatus (token)) :> ValueTaskSourceStatus member this.OnCompleted(continuation : Action<obj>, state : obj, token : System.Int16, flags : ValueTaskSourceOnCompletedFlags) = _waitSource.OnCompleted (continuation, state, token, flags) interface IValueTaskSource<bool> with member this.GetResult(token : int16) = _waitSource.GetResult (token) member this.GetStatus(token : int16) = (_waitSource.GetStatus (token)) :> ValueTaskSourceStatus member this.OnCompleted(continuation : Action<obj>, state : obj, token : System.Int16, flags : ValueTaskSourceOnCompletedFlags) = _waitSource.OnCompleted (continuation, state, token, flags) type VACore<'tmsg> = { mutable count: uint64 queueDepth: uint64 queue: ConcurrentQueue<'tmsg> vts: ResettableValueTaskSource vtsR: ResettableValueTaskSource ct: CancellationToken } [<RequireQualifiedAccess>] module AsyncChannels = let init<'t> qDepth ct = let queue = ConcurrentQueue<'t>() let vts = ResettableValueTaskSource(ct) //slow down the enqueue (when queue reaches depth) let vtsR = ResettableValueTaskSource(ct) //prevents cpu cycling (when queue is empty) let mutable count = queue.Count |> uint64 { count = count queueDepth = qDepth queue = queue vts = vts vtsR = vtsR ct = ct } let enqueue (core : VACore<'t>) (item : 't) = core.queue.Enqueue(item) let cnt = Threading.Interlocked.Increment(&core.count) core.vtsR.SignalWaiter() if Threading.Interlocked.Read(&core.count) > core.queueDepth then core.vts.WaitAsync() else ValueTask.CompletedTask let dequeue (core : VACore<'t>) = let isSuccessful, message = core.queue.TryDequeue() if isSuccessful then Threading.Interlocked.Decrement(&core.count) core.vts.SignalWaiter() ValueSome(message) else ValueNone let iter1 (core : VACore<'t>) (fn : 't -> unit) = task { while not <| core.ct.IsCancellationRequested do let dequeue = dequeue core if dequeue.IsSome then fn dequeue.Value if core.queue.IsEmpty && Interlocked.Read(&core.count) = 0UL then do! core.vtsR.WaitAsync() } |
The code here is extremely simplified, The ResettableValueTaskSource takes the role of ManuelResetEventSlim, but instead of scheduling to wake up the thread with kernel it schedules with the task scheduler. When the ResettableValueTaskSource is signaled the one and only one valuetask that is being awaited on will be complete and run its continuations on the thread pool as if it was a normal task.
Method | T | N | P | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Completed Work Items | Lock Contentions | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ValueActor | 1 | 100000 | False | 38.47 ms | 109.297 ms | 28.384 ms | 1.00 | 0.00 | - | - | - | 46.68 KB | 1.00 |
BoundedChannel | 1 | 100000 | False | 20.65 ms | 12.617 ms | 3.277 ms | 1.13 | 1.09 | - | 4857.0000 | 8.0000 | 383.81 KB | 8.22 |
ValueActor | 1 | 100000 | True | 99.34 ms | 97.873 ms | 25.417 ms | 1.00 | 0.00 | - | - | - | 17234.01 KB | 1.00 |
BoundedChannel | 1 | 100000 | True | 128.94 ms | 29.091 ms | 7.555 ms | 1.36 | 0.32 | - | 98900.0000 | 8.0000 | 24944.06 KB | 1.45 |
ValueActor | 15 | 100000 | False | 34.45 ms | 5.824 ms | 1.513 ms | 1.00 | 0.00 | - | - | - | 482.76 KB | 1.00 |
BoundedChannel | 15 | 100000 | False | 76.75 ms | 41.562 ms | 10.794 ms | 2.23 | 0.32 | - | 111201.0000 | 52.0000 | 8843.37 KB | 18.32 |
ValueActor | 15 | 100000 | True | 551.72 ms | 26.926 ms | 6.992 ms | 1.00 | 0.00 | 3000.0000 | - | - | 258284.42 KB | 1.00 |
BoundedChannel | 15 | 100000 | True | 569.16 ms | 28.188 ms | 7.320 ms | 1.03 | 0.01 | 3000.0000 | 803896.0000 | 635.0000 | 320931.56 KB | 1.24 |
ValueActor | 30 | 100000 | False | 93.57 ms | 51.640 ms | 13.411 ms | 1.00 | 0.00 | - | - | - | 950.22 KB | 1.00 |
BoundedChannel | 30 | 100000 | False | 127.36 ms | 32.105 ms | 8.338 ms | 1.38 | 0.13 | - | 54908.0000 | 1191.0000 | 3560.92 KB | 3.75 |
ValueActor | 30 | 100000 | True | 1,075.95 ms | 40.364 ms | 10.482 ms | 1.00 | 0.00 | 6000.0000 | - | - | 516553.65 KB | 1.00 |
BoundedChannel | 30 | 100000 | True | 1,073.02 ms | 24.850 ms | 6.453 ms | 1.00 | 0.01 | 6000.0000 | 59617.0000 | 2196.0000 | 520664.98 KB | 1.01 |
In the scenario of 10,000 actors/loops that last the length of the program, can something even more efficient be done. I think so, but that is all for today.
https://github.com/musheddev/PerfBuftype LiteralAttribute = inherit Attribute new: unit -> LiteralAttribute
--------------------
new: unit -> LiteralAttribute
type ThreadedActor<'tmsg> = interface IDisposable new: bodyFn: ('tmsg * ThreadedActor<'tmsg> -> unit) -> ThreadedActor<'tmsg> member Enqueue: msg: 'tmsg -> unit member Stop: unit -> unit member QueueCount: int
<summary> An actor pulls a message off of a (thread-safe) queue and executes it in the isolated context of the actor. </summary>
<typeparam name = "tmsg"> the type of messages that this actor will manage </typeparam>
<param name = "bodyFn"> the function to execute when the thread is available </param>
--------------------
new: bodyFn: ('tmsg * ThreadedActor<'tmsg> -> unit) -> ThreadedActor<'tmsg>
val int64: value: 'T -> int64 (requires member op_Explicit)
--------------------
type int64 = Int64
--------------------
type int64<'Measure> = int64
type ManualResetEventSlim = interface IDisposable new: unit -> unit + 2 overloads member Dispose: unit -> unit member Reset: unit -> unit member Set: unit -> unit member Wait: unit -> unit + 5 overloads member IsSet: bool member SpinCount: int member WaitHandle: WaitHandle
<summary>Represents a thread synchronization event that, when signaled, must be reset manually. This class is a lightweight alternative to <see cref="T:System.Threading.ManualResetEvent" />.</summary>
--------------------
ManualResetEventSlim() : ManualResetEventSlim
ManualResetEventSlim(initialState: bool) : ManualResetEventSlim
ManualResetEventSlim(initialState: bool, spinCount: int) : ManualResetEventSlim
type ConcurrentQueue<'T> = interface IProducerConsumerCollection<'T> interface IEnumerable<'T> interface IEnumerable interface ICollection interface IReadOnlyCollection<'T> new: unit -> unit + 1 overload member Clear: unit -> unit member CopyTo: array: 'T array * index: int -> unit member Enqueue: item: 'T -> unit member GetEnumerator: unit -> IEnumerator<'T> ...
<summary>Represents a thread-safe first in-first out (FIFO) collection.</summary>
<typeparam name="T">The type of the elements contained in the queue.</typeparam>
--------------------
ConcurrentQueue() : ConcurrentQueue<'T>
ConcurrentQueue(collection: Collections.Generic.IEnumerable<'T>) : ConcurrentQueue<'T>
<summary>Provides atomic operations for variables that are shared by multiple threads.</summary>
Interlocked.Read(location: byref<int64>) : int64
<summary>Gets a value that indicates whether the <see cref="T:System.Collections.Concurrent.ConcurrentQueue`1" /> is empty.</summary>
<returns><see langword="true" /> if the <see cref="T:System.Collections.Concurrent.ConcurrentQueue`1" /> is empty; otherwise, <see langword="false" />.</returns>
Interlocked.CompareExchange(location1: byref<uint64>, value: uint64, comparand: uint64) : uint64
Interlocked.CompareExchange(location1: byref<uint32>, value: uint32, comparand: uint32) : uint32
Interlocked.CompareExchange(location1: byref<float32>, value: float32, comparand: float32) : float32
Interlocked.CompareExchange(location1: byref<obj>, value: obj, comparand: obj) : obj
Interlocked.CompareExchange(location1: byref<unativeint>, value: unativeint, comparand: unativeint) : unativeint
Interlocked.CompareExchange(location1: byref<nativeint>, value: nativeint, comparand: nativeint) : nativeint
Interlocked.CompareExchange(location1: byref<int64>, value: int64, comparand: int64) : int64
Interlocked.CompareExchange(location1: byref<int>, value: int, comparand: int) : int
Interlocked.CompareExchange(location1: byref<float>, value: float, comparand: float) : float
Interlocked.Decrement(location: byref<uint32>) : uint32
Interlocked.Decrement(location: byref<int64>) : int64
Interlocked.Decrement(location: byref<int>) : int
ManualResetEventSlim.Wait(timeout: TimeSpan) : bool
ManualResetEventSlim.Wait(cancellationToken: CancellationToken) : unit
ManualResetEventSlim.Wait(millisecondsTimeout: int) : bool
ManualResetEventSlim.Wait(timeout: TimeSpan, cancellationToken: CancellationToken) : bool
ManualResetEventSlim.Wait(millisecondsTimeout: int, cancellationToken: CancellationToken) : bool
type Thread = inherit CriticalFinalizerObject new: start: ParameterizedThreadStart -> unit + 3 overloads member Abort: unit -> unit + 1 overload member DisableComObjectEagerCleanup: unit -> unit member GetApartmentState: unit -> ApartmentState member GetCompressedStack: unit -> CompressedStack member GetHashCode: unit -> int member Interrupt: unit -> unit member Join: unit -> unit + 2 overloads member Resume: unit -> unit ...
<summary>Creates and controls a thread, sets its priority, and gets its status.</summary>
--------------------
Thread(start: ParameterizedThreadStart) : Thread
Thread(start: ThreadStart) : Thread
Thread(start: ParameterizedThreadStart, maxStackSize: int) : Thread
Thread(start: ThreadStart, maxStackSize: int) : Thread
<summary>Represents the method that executes on a <see cref="T:System.Threading.Thread" />.</summary>
Thread.Start(parameter: obj) : unit
Interlocked.Increment(location: byref<uint32>) : uint32
Interlocked.Increment(location: byref<int64>) : int64
Interlocked.Increment(location: byref<int>) : int
<summary>Gets the number of elements contained in the <see cref="T:System.Collections.Concurrent.ConcurrentQueue`1" />.</summary>
<returns>The number of elements contained in the <see cref="T:System.Collections.Concurrent.ConcurrentQueue`1" />.</returns>
Interlocked.Exchange(location1: byref<uint64>, value: uint64) : uint64
Interlocked.Exchange(location1: byref<uint32>, value: uint32) : uint32
Interlocked.Exchange(location1: byref<float32>, value: float32) : float32
Interlocked.Exchange(location1: byref<obj>, value: obj) : obj
Interlocked.Exchange(location1: byref<unativeint>, value: unativeint) : unativeint
Interlocked.Exchange(location1: byref<nativeint>, value: nativeint) : nativeint
Interlocked.Exchange(location1: byref<int64>, value: int64) : int64
Interlocked.Exchange(location1: byref<int>, value: int) : int
Interlocked.Exchange(location1: byref<float>, value: float) : float
<summary>Provides a mechanism for releasing unmanaged resources.</summary>
Thread.Join(timeout: TimeSpan) : bool
Thread.Join(millisecondsTimeout: int) : bool
type ThreadedActor3<'tmsg> = interface IDisposable new: bodyFn: ('tmsg -> unit) * ct: CancellationToken -> ThreadedActor3<'tmsg> member Enqueue: msg: 'tmsg -> unit member QueueCount: int
--------------------
new: bodyFn: ('tmsg -> unit) * ct: CancellationToken -> ThreadedActor3<'tmsg>
[<Struct>] type CancellationToken = new: canceled: bool -> unit member Equals: other: obj -> bool + 1 overload member GetHashCode: unit -> int member Register: callback: Action -> CancellationTokenRegistration + 4 overloads member ThrowIfCancellationRequested: unit -> unit member UnsafeRegister: callback: Action<obj,CancellationToken> * state: obj -> CancellationTokenRegistration + 1 overload static member (<>) : left: CancellationToken * right: CancellationToken -> bool static member (=) : left: CancellationToken * right: CancellationToken -> bool member CanBeCanceled: bool member IsCancellationRequested: bool ...
<summary>Propagates notification that operations should be canceled.</summary>
--------------------
CancellationToken ()
CancellationToken(canceled: bool) : CancellationToken
<summary>Gets whether cancellation has been requested for this token.</summary>
<returns><see langword="true" /> if cancellation has been requested for this token; otherwise, <see langword="false" />.</returns>
<summary>Gets whether the event is set.</summary>
<returns>true if the event is set; otherwise, false.</returns>
type ThreadedActor4<'tmsg> = interface IDisposable new: bodyFn: ('tmsg -> unit) * qDepth: uint64 * ct: CancellationToken -> ThreadedActor4<'tmsg> member Enqueue: msg: 'tmsg -> unit member QueueCount: int
--------------------
new: bodyFn: ('tmsg -> unit) * qDepth: uint64 * ct: CancellationToken -> ThreadedActor4<'tmsg>
val uint64: value: 'T -> uint64 (requires member op_Explicit)
--------------------
type uint64 = UInt64
--------------------
type uint64<'Measure> = uint64
type ResettableValueTaskSource = interface IValueTaskSource<bool> interface IValueTaskSource new: cancellationToken: CancellationToken -> ResettableValueTaskSource member SignalWaiter: unit -> unit member WaitAsync: unit -> ValueTask
--------------------
new: cancellationToken: CancellationToken -> ResettableValueTaskSource
<summary>Provides the core logic for implementing a manual-reset <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource" /> or <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource`1" />.</summary>
<typeparam name="TResult">The type of the result of this manual-reset <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource`1" />.</typeparam>
<summary>Gets or sets whether to force continuations to run asynchronously.</summary>
<returns><see langword="true" /> to force continuations to run asynchronously; otherwise, <see langword="false" />.</returns>
CancellationToken.UnsafeRegister(callback: Action<obj,CancellationToken>, state: obj) : CancellationTokenRegistration
<summary>Represents an exception whose state is captured at a certain point in code.</summary>
type OperationCanceledException = inherit SystemException new: unit -> unit + 5 overloads member CancellationToken: CancellationToken
<summary>The exception that is thrown in a thread upon cancellation of an operation that the thread was executing.</summary>
--------------------
OperationCanceledException() : OperationCanceledException
OperationCanceledException(message: string) : OperationCanceledException
OperationCanceledException(token: CancellationToken) : OperationCanceledException
OperationCanceledException(message: string, innerException: exn) : OperationCanceledException
OperationCanceledException(message: string, token: CancellationToken) : OperationCanceledException
OperationCanceledException(message: string, innerException: exn, token: CancellationToken) : OperationCanceledException
type InvalidOperationException = inherit SystemException new: unit -> unit + 2 overloads
<summary>The exception that is thrown when a method call is invalid for the object's current state.</summary>
--------------------
InvalidOperationException() : InvalidOperationException
InvalidOperationException(message: string) : InvalidOperationException
InvalidOperationException(message: string, innerException: exn) : InvalidOperationException
type Exception = interface ISerializable new: unit -> unit + 2 overloads member GetBaseException: unit -> exn member GetObjectData: info: SerializationInfo * context: StreamingContext -> unit member GetType: unit -> Type member ToString: unit -> string member Data: IDictionary member HResult: int member HelpLink: string member InnerException: exn ...
<summary>Represents errors that occur during application execution.</summary>
--------------------
Exception() : Exception
Exception(message: string) : Exception
Exception(message: string, innerException: exn) : Exception
<summary>Contains methods for performing volatile memory operations.</summary>
(+0 other overloads)
Volatile.Write(location: byref<unativeint>, value: unativeint) : unit
(+0 other overloads)
Volatile.Write(location: byref<uint64>, value: uint64) : unit
(+0 other overloads)
Volatile.Write(location: byref<uint32>, value: uint32) : unit
(+0 other overloads)
Volatile.Write(location: byref<uint16>, value: uint16) : unit
(+0 other overloads)
Volatile.Write(location: byref<float32>, value: float32) : unit
(+0 other overloads)
Volatile.Write(location: byref<sbyte>, value: sbyte) : unit
(+0 other overloads)
Volatile.Write(location: byref<nativeint>, value: nativeint) : unit
(+0 other overloads)
Volatile.Write(location: byref<int64>, value: int64) : unit
(+0 other overloads)
Volatile.Write(location: byref<int>, value: int) : unit
(+0 other overloads)
[<Struct>] type ValueTask = new: source: IValueTaskSource * token: int16 -> unit + 1 overload member AsTask: unit -> Task member ConfigureAwait: continueOnCapturedContext: bool -> ConfiguredValueTaskAwaitable member Equals: obj: obj -> bool + 1 overload member GetAwaiter: unit -> ValueTaskAwaiter member GetHashCode: unit -> int member Preserve: unit -> ValueTask static member (<>) : left: ValueTask * right: ValueTask -> bool static member (=) : left: ValueTask * right: ValueTask -> bool static member FromCanceled: cancellationToken: CancellationToken -> ValueTask + 1 overload ...
<summary>Provides an awaitable result of an asynchronous operation.</summary>
--------------------
[<Struct>] type ValueTask<'TResult> = new: source: IValueTaskSource<'TResult> * token: int16 -> unit + 2 overloads member AsTask: unit -> Task<'TResult> member ConfigureAwait: continueOnCapturedContext: bool -> ConfiguredValueTaskAwaitable<'TResult> member Equals: obj: obj -> bool + 1 overload member GetAwaiter: unit -> ValueTaskAwaiter<'TResult> member GetHashCode: unit -> int member Preserve: unit -> ValueTask<'TResult> member ToString: unit -> string static member (<>) : left: ValueTask<'TResult> * right: ValueTask<'TResult> -> bool static member (=) : left: ValueTask<'TResult> * right: ValueTask<'TResult> -> bool ...
<summary>Provides a value type that wraps a <see cref="T:System.Threading.Tasks.Task`1" /> and a <typeparamref name="TResult" />, only one of which is used.</summary>
<typeparam name="TResult">The result.</typeparam>
--------------------
ValueTask ()
ValueTask(task: Task) : ValueTask
ValueTask(source: IValueTaskSource, token: int16) : ValueTask
--------------------
ValueTask ()
ValueTask(task: Task<'TResult>) : ValueTask<'TResult>
ValueTask(result: 'TResult) : ValueTask<'TResult>
ValueTask(source: IValueTaskSource<'TResult>, token: int16) : ValueTask<'TResult>
type IValueTaskSource = override GetResult: token: int16 -> unit override GetStatus: token: int16 -> ValueTaskSourceStatus override OnCompleted: continuation: Action<obj> * state: obj * token: int16 * flags: ValueTaskSourceOnCompletedFlags -> unit
<summary>Represents an object that can be wrapped by a <see cref="T:System.Threading.Tasks.ValueTask" />.</summary>
--------------------
type IValueTaskSource<'TResult> = override GetResult: token: int16 -> 'TResult override GetStatus: token: int16 -> ValueTaskSourceStatus override OnCompleted: continuation: Action<obj> * state: obj * token: int16 * flags: ValueTaskSourceOnCompletedFlags -> unit
<summary>Represents an object that can be wrapped by a <see cref="T:System.Threading.Tasks.ValueTask`1" />.</summary>
<typeparam name="TResult">The type of the result produced by the <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource`1" />.</typeparam>
<summary>Gets the operation version.</summary>
<returns>The operation version.</returns>
val int16: value: 'T -> int16 (requires member op_Explicit)
--------------------
type int16 = Int16
--------------------
type int16<'Measure> = int16
<summary>Indicates the status of an <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource" /> or <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource`1" />.</summary>
type Action = new: object: obj * method: nativeint -> unit member BeginInvoke: callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: unit -> unit
<summary>Encapsulates a method that has no parameters and does not return a value.</summary>
--------------------
type Action<'T> = new: object: obj * method: nativeint -> unit member BeginInvoke: obj: 'T * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: obj: 'T -> unit
<summary>Encapsulates a method that has a single parameter and does not return a value.</summary>
<param name="obj">The parameter of the method that this delegate encapsulates.</param>
<typeparam name="T">The type of the parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 -> unit
<summary>Encapsulates a method that has two parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 -> unit
<summary>Encapsulates a method that has three parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 -> unit
<summary>Encapsulates a method that has four parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 -> unit
<summary>Encapsulates a method that has five parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 -> unit
<summary>Encapsulates a method that has six parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 -> unit
<summary>Encapsulates a method that has seven parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 -> unit
<summary>Encapsulates a method that has eight parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 -> unit
<summary>Encapsulates a method that has nine parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 -> unit
<summary>Encapsulates a method that has 10 parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 -> unit
<summary>Encapsulates a method that has 11 parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 -> unit
<summary>Encapsulates a method that has 12 parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 -> unit
<summary>Encapsulates a method that has 13 parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13,'T14> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 -> unit
<summary>Encapsulates a method that has 14 parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg14">The fourteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T14">The type of the fourteenth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13,'T14,'T15> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 -> unit
<summary>Encapsulates a method that has 15 parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg14">The fourteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg15">The fifteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T14">The type of the fourteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T15">The type of the fifteenth parameter of the method that this delegate encapsulates.</typeparam>
--------------------
type Action<'T1,'T2,'T3,'T4,'T5,'T6,'T7,'T8,'T9,'T10,'T11,'T12,'T13,'T14,'T15,'T16> = new: object: obj * method: nativeint -> unit member BeginInvoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 * arg16: 'T16 * callback: AsyncCallback * object: obj -> IAsyncResult member EndInvoke: result: IAsyncResult -> unit member Invoke: arg1: 'T1 * arg2: 'T2 * arg3: 'T3 * arg4: 'T4 * arg5: 'T5 * arg6: 'T6 * arg7: 'T7 * arg8: 'T8 * arg9: 'T9 * arg10: 'T10 * arg11: 'T11 * arg12: 'T12 * arg13: 'T13 * arg14: 'T14 * arg15: 'T15 * arg16: 'T16 -> unit
<summary>Encapsulates a method that has 16 parameters and does not return a value.</summary>
<param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
<param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
<param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
<param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
<param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
<param name="arg6">The sixth parameter of the method that this delegate encapsulates.</param>
<param name="arg7">The seventh parameter of the method that this delegate encapsulates.</param>
<param name="arg8">The eighth parameter of the method that this delegate encapsulates.</param>
<param name="arg9">The ninth parameter of the method that this delegate encapsulates.</param>
<param name="arg10">The tenth parameter of the method that this delegate encapsulates.</param>
<param name="arg11">The eleventh parameter of the method that this delegate encapsulates.</param>
<param name="arg12">The twelfth parameter of the method that this delegate encapsulates.</param>
<param name="arg13">The thirteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg14">The fourteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg15">The fifteenth parameter of the method that this delegate encapsulates.</param>
<param name="arg16">The sixteenth parameter of the method that this delegate encapsulates.</param>
<typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T6">The type of the sixth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T7">The type of the seventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T8">The type of the eighth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T9">The type of the ninth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T10">The type of the tenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T11">The type of the eleventh parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T12">The type of the twelfth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T13">The type of the thirteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T14">The type of the fourteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T15">The type of the fifteenth parameter of the method that this delegate encapsulates.</typeparam>
<typeparam name="T16">The type of the sixteenth parameter of the method that this delegate encapsulates.</typeparam>
<summary>Represents a 16-bit signed integer.</summary>
<summary>Provides flags passed from <see cref="T:System.Threading.Tasks.ValueTask" /> and <see cref="T:System.Threading.Tasks.ValueTask`1" /> to the <see langword="OnCompleted" /> method to control the behavior of a continuation.</summary>
type RequireQualifiedAccessAttribute = inherit Attribute new: unit -> RequireQualifiedAccessAttribute
--------------------
new: unit -> RequireQualifiedAccessAttribute
<summary>Gets a task that has already completed successfully.</summary>