zoukankan      html  css  js  c++  java
  • 任务锁和自定义控件制作

    大四学生,又要实习又要上课,结果好久没写了。这回分享些东西吧!

    Win 8提供的控件中,有几个要么无法修改背景颜色,字体颜色等样式,要么就是有些丑,不好看。

    其中隐藏菜单就是一个,无法修改菜单的背景颜色、字体颜色,鼠标划过颜色和点击的颜色。

    消息框,一样无法修改它的样式。而下拉选择框则是比较丑陋(个人以为,不要在意)。

    所以,为了和项目风格搭配,只好自己实现这些控件。首先,直接上图,看看效果。

         

    MyControl.MyMesseageBox mbox = new MyControl.MyMesseageBox();
    int res = await mbox.Show(this.ActualWidth / 2, this.ActualHeight / 2,Message);
    

    而为了能做到await 等待我们处理完得到选择结果,而且又不会卡主UI线程,这时候就要用到一个任务锁的类。关于这个类,是我在一个外国人的博客看到的,非常好用。Win 8的Sqlite数据库好像还没有见到有事务的用法。而有时需要达到事务的效果,就可以使用这个事务锁。废话不多说,直接贴代码!

    public class AsyncSemaphore
        {
            private readonly static Task s_completed = Task.FromResult(true);
            private readonly Queue<TaskCompletionSource<bool>> m_waiters = new Queue<TaskCompletionSource<bool>>();
            private int m_currentCount;
    
            public AsyncSemaphore(int initialCount)
            {
                if (initialCount < 0) throw new ArgumentOutOfRangeException("initialCount");
                m_currentCount = initialCount;
            }
    
            public Task WaitAsync()
            {
                lock (m_waiters)
                {
                    if (m_currentCount > 0)
                    {
                        --m_currentCount;
                        return s_completed;
                    }
                    else
                    {
                        var waiter = new TaskCompletionSource<bool>();
                        m_waiters.Enqueue(waiter);
                        return waiter.Task;
                    }
                }
            }
    
            public void Release()
            {
                TaskCompletionSource<bool> toRelease = null;
                lock (m_waiters)
                {
                    if (m_waiters.Count > 0)
                        toRelease = m_waiters.Dequeue();
                    else
                        ++m_currentCount;
                }
                if (toRelease != null)
                    toRelease.SetResult(true);
            }
        }
    

      使用这个锁,就可以实现等待了,至于控件想做成什么样,这就要看你Xaml上面的功底了,或者使用Blend设计也是不错的选择。

  • 相关阅读:
    springboot跨域解决
    python实现LRUCache
    oracle整库统计库表数据量--存储过程
    oracle整库统计库表各个字段数据最大长度--存储过程
    mysql数据库初始化脚本分组批量执行
    maven profile 的作用
    配置中包含maven属性,在idea中本地启动无法正常获取配置
    个人随笔
    Java接口interface field及method
    如何将.net core项目部署到IIS上?
  • 原文地址:https://www.cnblogs.com/qingfengwutong/p/2957795.html
Copyright © 2011-2022 走看看