63 lines
1.4 KiB
C#
63 lines
1.4 KiB
C#
|
using System.Collections.Concurrent;
|
|||
|
using System.Drawing;
|
|||
|
|
|||
|
namespace DispenserCommon.Queue;
|
|||
|
|
|||
|
public class BitmapQueue
|
|||
|
{
|
|||
|
private bool _isProcessing;
|
|||
|
private readonly ConcurrentQueue<Bitmap> _queue = new();
|
|||
|
private readonly Action<Bitmap> ImageProcessor;
|
|||
|
|
|||
|
public BitmapQueue(Delegate @delegate)
|
|||
|
{
|
|||
|
ImageProcessor = (Action<Bitmap>)@delegate;
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
public void Clear()
|
|||
|
{
|
|||
|
_queue.Clear();
|
|||
|
}
|
|||
|
|
|||
|
// 将BitmapItem加入队列
|
|||
|
public void Enqueue(Bitmap item)
|
|||
|
{
|
|||
|
_queue.Enqueue(item);
|
|||
|
StartProcessing(); // 尝试开始处理(如果尚未开始)
|
|||
|
}
|
|||
|
|
|||
|
// 开始处理队列中的BitmapItem
|
|||
|
private void StartProcessing()
|
|||
|
{
|
|||
|
if (_isProcessing) return;
|
|||
|
_isProcessing = true;
|
|||
|
|
|||
|
Task.Run(ProcessQueue).ContinueWith(t =>
|
|||
|
{
|
|||
|
// 处理完成后的逻辑(如果有的话)
|
|||
|
_isProcessing = false;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// 异步处理队列
|
|||
|
private async Task ProcessQueue()
|
|||
|
{
|
|||
|
while (_queue.TryDequeue(out var item))
|
|||
|
try
|
|||
|
{
|
|||
|
// 这里处理Bitmap,例如保存、修改等
|
|||
|
await ProcessBitmapAsync(item);
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
// 确保释放资源
|
|||
|
item.Dispose();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private Task ProcessBitmapAsync(Bitmap item)
|
|||
|
{
|
|||
|
return Task.Run(() => { ImageProcessor(item); });
|
|||
|
}
|
|||
|
}
|