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); });
|
||
}
|
||
} |