111,129
社区成员
发帖
与我相关
我的任务
分享using System;
using System.Collections.Generic;
using System.Threading;
using System.Reflection;
namespace showjim.sys.threading
{
/// <summary>
/// 队列处理线程
/// </summary>
/// <typeparam name="valueType">队列处理值类型</typeparam>
public class queue<valueType>
{
#region 队列处理信息
/// <summary>
/// 队列处理信息
/// </summary>
private class queueInfo
{
/// <summary>
/// 待处理对象
/// </summary>
public valueType value;
/// <summary>
/// 处理委托
/// </summary>
public showjim.sys.run<valueType> onProcess;
}
#endregion
/// <summary>
/// 队列操作锁
/// </summary>
private object queueLock = new object();
/// <summary>
/// 待处理队列
/// </summary>
private List<queueInfo> queues = new List<queueInfo>();
/// <summary>
/// 队列处理线程
/// </summary>
private Thread queueThreadHandle;
/// <summary>
/// 处理委托
/// </summary>
private showjim.sys.run<valueType> onProcess;
/// <summary>
/// 暂停或恢复队列处理线程
/// </summary>
public bool _isPause = false;
/// <summary>
/// 暂停或恢复队列处理线程
/// </summary>
public bool isPause
{
set
{
if (value) close(true);
else add(null);
}
}
#region 初始化队列处理线程
/// <summary>
/// 初始化队列处理线程
/// </summary>
/// <param name="onProcess">处理委托</param>
public queue(showjim.sys.run<valueType> onProcess)
{
this.onProcess = onProcess;
}
#endregion
#region 关闭队列处理线程
/// <summary>
/// 关闭队列处理线程
/// </summary>
~queue() { close(false); }
/// <summary>
/// 关闭队列处理线程
/// </summary>
/// <param name="isPause">是否暂停队列处理线程</param>
public void close(bool isPause)
{
Thread handle = null;
Monitor.Enter(queueLock);
try
{
_isPause = isPause;
if (queueThreadHandle != null)
{
handle = queueThreadHandle;
queueThreadHandle = null;
if (!isPause) queues.Clear();
}
}
finally { Monitor.Exit(queueLock); }
if (handle != null && handle.IsAlive) handle.Abort();
}
#endregion
#region 添加待处理对象
/// <summary>
/// 添加待处理对象
/// </summary>
/// <param name="value">待处理对象</param>
public void add(valueType value) { add(new queueInfo { value = value, onProcess = null }); }
/// <summary>
/// 添加待处理对象
/// </summary>
/// <param name="value">待处理对象</param>
/// <param name="onProcess">处理委托</param>
public void add(valueType value, showjim.sys.run<valueType> onProcess) { add(new queueInfo { value = value, onProcess = onProcess }); }
/// <summary>
/// 添加待处理对象
/// </summary>
/// <param name="value">待处理对象信息</param>
private void add(queueInfo value)
{
Thread handle = null;
Monitor.Enter(queueLock);
try
{
if (this.onProcess != null || value == null || value.onProcess != null)
{
if (value != null) queues.Add(value);
if (queueThreadHandle == null && (value == null || !_isPause) && queues.Count != 0) handle = queueThreadHandle = new Thread(new ThreadStart(queueThread));
}
}
finally { Monitor.Exit(queueLock); }
if (handle != null)
{
handle.IsBackground = true;
handle.Start();
}
}
#endregion
#region 队列处理线程
/// <summary>
/// 队列处理线程
/// </summary>
public void queueThread()
{
for (queueInfo value = next(); value != null; value = next())
{
try { (value.onProcess == null ? this.onProcess : value.onProcess)(value.value); }
catch (Exception error) { showjim.sys.exception.debug.writeDebug(MethodBase.GetCurrentMethod(), typeof(valueType).FullName + " 队列处理失败", error); }
}
}
/// <summary>
/// 获取下一个待处理对象
/// </summary>
/// <returns>待处理对象</returns>
private queueInfo next()
{
queueInfo value = null;
Thread handle = null;
Monitor.Enter(queueLock);
if (queueThreadHandle != null && queues.Count != 0)
{
value = queues[0];
queues.RemoveAt(0);
}
else
{
handle = queueThreadHandle;
queueThreadHandle = null;
}
Monitor.Exit(queueLock);
if (handle != null)
{
if (handle.IsAlive)
{
try { handle.Abort(); }
catch { }
}
}
return value;
}
#endregion
}
}
/// <summary>
/// 获取2个时间点的时间中CPU运行的次数
/// </summary>
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
/// <summary>
/// 获取CPU频率
/// </summary>
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency); lpFrequency);