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


                }

            }

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

    代码示例:点击打开链接

  • 相关阅读:
    自动安装rpm依赖
    goroutine上下文contxt语法
    goroutine 上下文用法
    Template Method 模式
    设计模式2--设计原则
    centos7关机自动进行远程服务器备份
    实用工具使用
    剑指offer python版 滑动窗口的最大值
    剑指offer python版 左旋转字符串
    剑指offer python版 翻转单词顺序
  • 原文地址:https://www.cnblogs.com/grj001/p/12224579.html
Copyright © 2011-2022 走看看