GraphicsResourcePool.cs
2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVMapDemo.DemoModel
{
public class GraphicsResourcePool
{
private readonly ConcurrentBag<GraphicsResource> _pool;
private readonly object _lock = new object();
private readonly int _maxPoolSize;
public GraphicsResourcePool(int initialSize, int maxPoolSize)
{
_pool = new ConcurrentBag<GraphicsResource>();
_maxPoolSize = maxPoolSize;
// 初始化对象池
for (int i = 0; i < initialSize; i++)
{
_pool.Add(CreateNewResource());
}
}
// 获取一个GraphicsResource对象,如果池中有可用的对象,则重用;否则,创建新对象(如果未达到最大池大小)
public GraphicsResource Get()
{
if (_pool.TryTake(out GraphicsResource resource))
{
return resource;
}
else
{
lock (_lock)
{
if (_pool.Count < _maxPoolSize)
{
return CreateNewResource();
}
}
// 如果池已满,则等待或采取其他措施...(这里简单抛出异常)
throw new InvalidOperationException("Pool is full and cannot create new resource.");
}
}
// 将一个GraphicsResource对象放回池中
public void Put(GraphicsResource resource)
{
if (resource != null)
{
_pool.Add(resource);
}
}
// 创建新的GraphicsResource对象
private GraphicsResource CreateNewResource()
{
// 在实际应用中,这里应该根据需求创建并初始化GraphicsResource对象
// 例如,可能需要指定宽度和高度等参数
return new GraphicsResource(800, 600); // 假设的宽度和高度
}
}
}