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


                }

            }

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

    代码示例:点击打开链接

  • 相关阅读:
    windows Git安装
    windows 下安装Python
    windows 下安装mongodb及其配置环境
    kafka服务安装-SuSE Linux Enterprise Server 11 SP3
    SUSE Linux 下redis 的坑
    windows 下安装nodejs及其配置环境
    redis服务器安装-SuSE Linux Enterprise Server 11 SP3
    svn服务器搭建-SuSE Linux Enterprise Server 11 SP3
    安装MySQL -- SuSE Linux Enterprise Server 11 SP3
    Git命令参考手册(文本版)
  • 原文地址:https://www.cnblogs.com/grj001/p/12224579.html
Copyright © 2011-2022 走看看