当winform中控件实时调用时,往往回调事件中有耗时操作,导致控件的操控变得卡顿,用户体验不好,这时可以忽略一部分事件消息,只执行最终的消息。
思路如下:建立一个线程安全的泛型队列
ConcurrentQueue<T> queue
当有消息时入列:
queue.Enqueue(item);
同时使用线程池触发自定义的消息发送方法
ThreadPool.QueueUserWorkItem(doUserWork);
/// <summary>
/// 处理队列中对象的函数
/// </summary>
/// <param name="o"></param>
private void doUserWork(object o)
{
try
{
T item = default(T);
while (queue.Count > 0)
{
if (!queue.TryDequeue(out item))
{
IsWorking = false;
return;
}
}
if (!item.Equals(default(T)) || item.GetType().Equals(typeof(Int32)))
{
try
{
DoTheEvent(item);
}
catch
{
IsWorking = false;
}
}
}
catch (Exception ex)
{
Global.Log("WorkQueue", ex.Message);
}
}
private void DoTheEvent(T item)
{
if (UserWork != null)
{
if (UserWork(this, new EnqueueEventArgs(item)) == true)
{
if (queue.Count > 0)
{
ThreadPool.QueueUserWorkItem(doUserWork);
}
else
{
IsWorking = false;
}
}
else
{
DoTheEvent(item);
}
}
}
当真正的回调函数没有返回则已经入列的消息不执行,直到回调函数返回后,执行队列中最新的一个消息,其他的消息已经被忽略了。
代码示例:点击打开链接