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


                }

            }

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

    代码示例:点击打开链接

  • 相关阅读:
    全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口
    全栈项目|小书架|微信小程序-首页水平轮播实现
    全栈项目|小书架|微信小程序-登录及token鉴权
    全栈项目|小书架|微信小程序-项目结构设计分包
    Python学习第123天(Django回头看:模板控制语句、filter、simple_tag)
    Python学习第122天(Django回头看:视图函数、redirect、模板变量、过滤器)
    Python学习第121天(Django2的include使用)
    Python学习第120天(Django1和2之间的区别)
    Python学习第119天(练习)
    Python学习第119天(暂停)
  • 原文地址:https://www.cnblogs.com/grj001/p/12224579.html
Copyright © 2020-2023  润新知