zoukankan      html  css  js  c++  java
  • 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++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)
    Moon.Orm 5.0(MQL版)使用指南
    初学 快速幂 的理解
    2016 杭电
    2015 偶数求和 AC 杭电
    2014 青年歌手大赛 AC
    C语言初学 数组 打印菱形
  • 原文地址:https://www.cnblogs.com/grj001/p/12224580.html
Copyright © 2011-2022 走看看