lock (mPools)
12
{
13
for (int i = 0; i < pools; i++)
14
{
15
mPools.Add(new BufferPool(buffers, bufferlength));
16
}
17
}
18
}
19
public static void Clean()
20
{
21
lock (mPools)
22
{
23
foreach (BufferPool item in mPools)
24
{
25
item.Dispose();
26
}
27
mPools.Clear();
28
}
29
}
30
public static BufferPool GetPool()
31
{
32
lock (mPools)
33
{
34
if (mIndex == mPools.Count)
35
{
36
mIndex = 0;
37
}
38
return mPools[mIndex];
39
}
40
}
41
Queue mBuffers;
42
private int mBufferLength;
43
public BufferPool(int count, int bufferlength)
44
{
45
mBufferLength = bufferlength;
46
mBuffers = new Queue(count);
47
for (int i = 0; i < count; i++)
48
{
49
mBuffers.Enqueue(createBuffer(bufferlength));
50
}
51
}
52
private DataBuffer createBuffer(int length)
53
{
54
DataBuffer item = new DataBuffer(length);
55
item.Pool = this;
56
return item;
57
}
58
public DataBuffer Pop()
59
{
60
lock (mBuffers)
61
{
62
return mBuffers.Count > 0 mBuffers.Dequeue() : createBuffer(mBufferLength);
63
}
64
}
65
public void Push(DataBuffer buffer)
66
{
67
lock (mBuffers)
68
{
69
mBuffers.Enqueue(buffer);
70
}
71
}
72
private bool mDisposed = false;
73
private void OnDispose()
74
{
75
lock (mBuffers)
76
{
77
while (mBuffers.Count > 0)
78
{
79
mBuffers.Dequeue().Pool = null;
80
}
81
}
82
}
83
public void Dispose()
84
{
85
lock (this)
86
{
87
if (!mDisposed)
88
{
89
OnDispose();
90
mDisposed = true;
91
}
92
}
93
}
94
}
BufferPool实现了几个静态方法
Setup
主要目的是用于构造多个缓冲池,缓冲区数量和缓冲区大小。为什么会考虑多个池呢,主要原因是在高并发的来分配处理减低池的负载。
Clean
用于清除释放缓冲池
GetPool
平均地分发缓冲池给使用者
一个简单的数据缓冲区和数据缓冲池已经实现了,在后面的文章里会讲述如何构造BufferWriter和BufferReader,根据对象的需要把信息分别写入多个缓冲区和在多个缓冲区中读取信息还原对象。
摘自 smark