C# SpinWait 高性能同步

前言 以前做多线程同步的时候,非常喜欢用无锁队列 ConcurrentQueue<T> ,随着对多线程原理了解的深入,决定放弃这种一知半解的形式,打算把以前写的一个程序重构一下。 在重构到多线程的时候,有这样一个场景: 有一个 int 变量 i,初始值为 1,  有一个线程1 ,以极限频率访问 i,如果 i 等于 0,则线程结束, 有一个按钮 button1,按下 button1 就把 i 的值修改为 0 . 代码如下: int i = 1; private void Form1_L […]

userControl 控件的开发

前言 .Net 预置的控件已经不能满足日益多样的功能、操作、界面需求。 下面制作一个 “身份证控件” 为例。先画一个草图,控件大概就长这个样子: 一,visual studio 里右键项目或者目录,添加 -> 用户控件。 没有 “用户控件” 的话,可以在 “新建项” 里找到。 然后 vs 会帮我们准备好必要的文件,并且弹出一个新的 [设计] 工作簿。 如果把开发用户控件比喻为绘画的话,里面的灰白色区域就是画板,怎么画,就看各位的生花妙笔了。 二,给控件添加属性 以预置的 But […]

回调函数之理解

前言 回调函数,其实就是 . Net 预置的一个委托,请看定义: using System.Runtime.InteropServices; namespace System { // // 摘要: // 引用在相应异步操作完成时调用的方法。 // // 参数: // ar: // 异步操作的结果。 [ComVisible(true)] public delegate void AsyncCallback(IAsyncResult ar); } 符合这样形式的都可以算回调函数。 那回调函数存在的 […]

为什么要使用反射

前言 废话不多说,“反射” 有哪些用途呢?根据我目前接触到的,总结了下面 3 种常见的反射应用场景: 1,动态加载对象。 2,赋予应用程序装载插件的能力。 3,创建对象并给对象属性赋值。 下面按照顺序,举例说明这 3 种反射场景。 一,动态加载对象 这里以动态加载应用程序窗体为例。假如有个按钮,用户点击按钮后,弹出其他窗体,常规代码如下: using System; using System.Windows.Forms; namespace Reflect_Test { public parti […]