共计 1175 个字符,预计需要花费 3 分钟才能阅读完成。
到目前为止,咱们始终在应用所谓的“Unbounded”通道。你会留神到,当咱们创立通道时,咱们这样做:
var myChannel = Channel.CreateUnbounded<int>();
但实际上,咱们能够这样做:
var myChannel = Channel.CreateBounded<int>(1000);
这与创立容量无限的列表或数组等其余汇合类型并无太大差异。在咱们的示例中,咱们创立了一个最多包容 1000 项的 Channel。但为什么要限度本人呢? 这就是背压的作用。
什么是背压?
背压 (特地是当波及消息传递 / 排队时) 是指资源 (无论是内存、ram、网络) 是无限的。咱们应该可能在链条上施加“压力”,试着加重一些压力。至多,让生态系统中的其他人晓得咱们负荷过重,咱们可能须要一些工夫来解决他们的申请。
一般来说,当咱们探讨队列的背压时。简直所有状况下,咱们都在探讨一种办法,通知任何试图在队列中增加更多条目标人,要么他们根本无法再退出任何条目,要么他们须要推后一段时间。更常见的是,咱们探讨的队列是在达到肯定容量时纯正抛弃音讯。这种状况很少产生,然而咱们有这个选项。
那么它是如何与.net Channel 一起工作的呢?
Channel 中的背压
当应用通道时,咱们实际上有一个非常简单的办法来减少背压。代码看起来是这样的:
var channelOptions = new BoundedChannelOptions(5)
{FullMode = BoundedChannelFullMode.Wait};
var myChannel = Channel.CreateBounded<int>(channelOptions);
咱们能够指定以下残缺模式:
期待
在关上 WriteAsync()调用之前,只需让调用者期待。
DropNewest / DropOldest
能够在 Channel 中拖放最老的或最新的我的项目,为咱们想要增加的项腾出空间。
DropWrite
简略地转储咱们应该写的音讯。
还有另外两段代码须要留神。
你能够调用 WaitToWriteAsync():
await myChannel.Writer.WaitToWriteAsync();
这让咱们 Channel 成了有界。当 Channel 已满时,咱们能够简略地期待,直到有空间。这意味着,即便关上了 DropWrite FullMode,咱们也能够通过简略地期待,直到有容量为止,来限度扔在高空上的音讯数量。
咱们应该留神的另一段代码是:
var success = myChannel.Writer.TryWrite(i);
这容许咱们尝试写入队列,并返回,无论胜利与否。须要留神的是,此办法不是异步的。要么写入信道要么不写入信道,这里没有 ” 如果你再多等一会儿,兴许能够。”
欢送关注我的公众号,如果你有喜爱的外文技术文章,能够通过公众号留言举荐给我。