从共享 ArrayPool 中租用和返回 C# 中的多维数组的正确方法?

Posted

技术标签:

【中文标题】从共享 ArrayPool 中租用和返回 C# 中的多维数组的正确方法?【英文标题】:Correct way of Renting and Returning a multi-dimensional array in C# from shared ArrayPool? 【发布时间】:2021-07-17 18:43:14 【问题描述】:

例如,这是正确的使用场景吗?

// Rent
var rentedArray = ArrayPool<int[]>.Shared.Rent(2);

rentedArray[0] = ArrayPool<int>.Shared.Rent(10);
rentedArray[1] = ArrayPool<int>.Shared.Rent(10);

// Return
foreach (var array in rentedArray)

    ArrayPool<int>.Shared.Return(array, true);


ArrayPool<int[]>.Shared.Return(rentedArray, true);

【问题讨论】:

@Dalorzo 抱歉,我不太明白你在问什么?一般来说,从共享 ArrayPool 中租用和返回多维数组是这样完成的吗? 你读过field manual吗? @NicholasHunter 是的,我有,我只是想确保这是租用多维数组的正确方法。 您的代码是正确的,关于如何使用API​​来租用和返回数组正在使用中。 @mm8 这就是我想知道的,谢谢。 【参考方案1】:

就如何使用 API 租用和返回数组而言,您的代码是正确的。

您使用Rent API 租用具有最小指定长度的数组,将其存储在一个变量中,然后使用Return API 返回相同的数组。

【讨论】:

我有点困惑,但是返回锯齿状数组不会也返回其他数组吗?如果我可以要求一个特定的用例:想象你必须在一个数组中填充数据 10 次 - 你会租用并返回 10 次数组,还是租一次,然后清理它9 次?谢谢mm8。 不,您只租用并归还特定实例。出租、使用、清洁、归还。【参考方案2】:

为了澄清术语,这通常称为“锯齿状数组”或数组数组。

例如:

int[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[10];
jaggedArray[1] = new int[10];

与俗称的“多维数组”对比:

int[,] dimensionalArray = new int[2,10];

看起来 ArrayPool 类只处理一维数组,所以你的锯齿状数组方法可能是你想要的。

代码将不太清楚..考虑一下外部数组缓冲区是否真的需要,对于您的场景..如果是的话,如何以与可读不同的方式命名它内部数组缓冲区。

【讨论】:

以上是关于从共享 ArrayPool 中租用和返回 C# 中的多维数组的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

租用服务器选独享带宽好还是共享带宽好?

ArrayPool 源码解读之 byte[] 也能池化?

如何:在检查不可用的网络共享时防止超时 - C#

是否可以从我的 PC 上租用 Azure 磁盘并通过 iSCSI 连接到它们?

在 C# Web 应用程序中从网络共享访问文件

c++和c#之间的共享内存同步