| File: System\Threading\Channels\ChannelOptions.cs | Web Access |
| Project: src\runtime\src\libraries\System.Threading.Channels\src\System.Threading.Channels.csproj (System.Threading.Channels) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace System.Threading.Channels { /// <summary>Provides options that control the behavior of channel instances.</summary> public abstract class ChannelOptions { /// <summary> /// <code>true</code> if writers to the channel guarantee that there will only ever be at most one write operation /// at a time; <code>false</code> if no such constraint is guaranteed. /// </summary> /// <remarks> /// If true, the channel may be able to optimize certain operations based on knowing about the single-writer guarantee. /// The default is false. /// </remarks> public bool SingleWriter { get; set; } /// <summary> /// <code>true</code> if readers from the channel guarantee that there will only ever be at most one read operation /// at a time; <code>false</code> if no such constraint is guaranteed. /// </summary> /// <remarks> /// If true, the channel may be able to optimize certain operations based on knowing about the single-reader guarantee. /// The default is false. /// </remarks> public bool SingleReader { get; set; } /// <summary> /// <code>true</code> if operations performed on a channel may synchronously invoke continuations subscribed to /// notifications of pending async operations; <code>false</code> if all continuations should be invoked asynchronously. /// </summary> /// <remarks> /// Setting this option to <code>true</code> can provide measurable throughput improvements by avoiding /// scheduling additional work items. However, it may come at the cost of reduced parallelism, as for example a producer /// may then be the one to execute work associated with a consumer, and if not done thoughtfully, this can lead /// to unexpected interactions. The default is false. /// </remarks> public bool AllowSynchronousContinuations { get; set; } } /// <summary>Provides options that control the behavior of instances created by <see cref="M:Channel.CreateBounded"/>.</summary> public sealed class BoundedChannelOptions : ChannelOptions { /// <summary>The maximum number of items the bounded channel may store.</summary> private int _capacity; /// <summary>The behavior incurred by write operations when the channel is full.</summary> private BoundedChannelFullMode _mode = BoundedChannelFullMode.Wait; /// <summary>Initializes the options.</summary> /// <param name="capacity">The maximum number of items the bounded channel may store.</param> /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is negative.</exception> public BoundedChannelOptions(int capacity) { if (capacity < 0) { throw new ArgumentOutOfRangeException(nameof(capacity)); } _capacity = capacity; } /// <summary>Gets or sets the maximum number of items the bounded channel may store.</summary> /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is negative.</exception> public int Capacity { get => _capacity; set { if (value < 0) { throw new ArgumentOutOfRangeException(nameof(value)); } _capacity = value; } } /// <summary>Gets or sets the behavior incurred by write operations when the channel is full.</summary> /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is an invalid enum value.</exception> public BoundedChannelFullMode FullMode { get => _mode; set { switch (value) { case BoundedChannelFullMode.Wait: case BoundedChannelFullMode.DropNewest: case BoundedChannelFullMode.DropOldest: case BoundedChannelFullMode.DropWrite: _mode = value; break; default: throw new ArgumentOutOfRangeException(nameof(value)); } } } } /// <summary>Provides options that control the behavior of instances created by <see cref="M:Channel.CreateUnbounded"/>.</summary> public sealed class UnboundedChannelOptions : ChannelOptions { } }