GraphicsResourcePool.cs 2.1 KB
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); // 假设的宽度和高度  
        }
    }
}