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


                }

            }

    当真正的回调函数没有返回则已经入列的消息不执行,直到回调函数返回后,执行队列中最新的一个消息,其他的消息已经被忽略了。

    代码示例:点击打开链接

  • 相关阅读:
    七种常见的回归分析—转载
    Python模块之 __future__ 转载
    Java 快速排序
    在给定范围内产生指定个数不重复的随机数
    Java 冒泡排序
    jquery文本框效果
    jquery复选框
    struts2下的Ajax
    java线程系列---Runnable和Thread的区别
    System.getProperty("user.dir")
  • 原文地址:https://www.cnblogs.com/grj001/p/12224580.html
Copyright © 2020-2023  润新知