تكرار السؤال: …
الإجابة المختصرة
توفر مخزناً للمصفوفات وكتل الذاكرة يعاد استخدامها واستئجارها (Rent) وإرجاعها (Return) بدلاً من حجز مصفوفات جديدة وحذفها في كل طلب.
الشرح
في الخوادم التي تعالج آلاف الطلبات في الثانية، حجز مصفوفات byte[] لقراءة حزم الشبكة والملفات يملأ Gen 0 بسرعة ويجبر الـ GC على إيقاف العمليات دورياً. استخدام ArrayPool<T>.Shared.Rent(minSize) يستعير مصفوفة موجودة مسبقاً في الـ Pool في كسر من الميكروثانية، وعند الانتهاء بكتلة finally يُستدعى pool.Return(array)، مما يحقق استقراراً فائقاً للذاكرة وصفر ضغط على الـ GC.
مثال بالكود
var pool = ArrayPool<byte>.Shared;
byte[] buffer = pool.Rent(4096);
try {
int bytesRead = await stream.ReadAsync(buffer);
Process(buffer.AsSpan(0, bytesRead));
} finally {
pool.Return(buffer); // إعادة تدوير المصفوفة
}أخطاء شائعة
- نسيان إرجاع المصفوفة المستعارة في كتلة finally مما يفرغ الـ Pool ويفقد الميزة فاعليتها.