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设计也是不错的选择。

  • 相关阅读:
    WEP编码格式
    OSK VFS read数据流分析
    科学剖析濒死体验 "复生"者讲述"死"前1秒钟
    Android的开发相对于tizen的开发难度
    minix文件系统分析
    贴给小程序(1) 查找第一个0值
    Linux下的QQ
    OSK USB 驱动
    LRU算法之hash+list实现(转)
    插入排序
  • 原文地址:https://www.cnblogs.com/qingfengwutong/p/2957795.html
Copyright © 2011-2022 走看看