C# winform中的事件传递过程中忽略部分事件消息
C# winform中的事件传递过程中忽略部分事件消息
2018年02月09日 16:17:56 himalayahofman 阅读数 163
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/himalayahofman/article/details/79299622
当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);
}
}
}
当真正的回调函数没有返回则已经入列的消息不执行,直到回调函数返回后,执行队列中最新的一个消息,其他的消息已经被忽略了。
代码示例:点击打开链接
相关文章
- 学习C#,重温VB
- C#如何开发多语言支持的Winform程序
- C# Winform学习(六)
- C# winform 学习(一)
- C# 文件操作 把文件读取到字节数组
- 【C#】Excel导出合并行和列并动态加载行与列
- 笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new
- c# unsafe
- C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp区别与联系
- C# WinForm中PreviewKeyDown、KeyDown、KeyPress、KeyUp区别与联系
- C# RichTextBox的用法
- C# 日志类
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- (八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)
- (七十三)c#Winform自定义控件-资源加载窗体-HZHControls
- (六十五)c#Winform自定义控件-思维导图/组织架构图(工业)-HZHControls
- (三十四)c#Winform自定义控件-Tab页-HZHControls
- (十五)c#Winform自定义控件-键盘(二)-HZHControls
- C# 数组与字符串转换
- C# linq group by
- C#学习笔记(四)——变量的更多内容
- 如何在 C# 中使用 AutoMapper
- C# WinForm 界面控件
- C#winform-多线程【案例+源码】
- C# winform窗体程序-菜单动态合并(MDI窗体)
- C#、C++、Java、Python选择哪个好?