到目前为止,咱们始终在应用所谓的“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);

这容许咱们尝试写入队列,并返回,无论胜利与否。须要留神的是,此办法不是异步的。要么写入信道要么不写入信道,这里没有"如果你再多等一会儿,兴许能够。”

 欢送关注我的公众号,如果你有喜爱的外文技术文章,能够通过公众号留言举荐给我。