一的话说调用一个表面进程这么不难的一件事究竟会有啥难点,即便不是烂片

一个C#写的调用外部进度类

前言

作者:肖波

  农民父亲——背靠沙发,瞅着春晚,吃着水果,写着统计……

    C#
调用外表进度的类,网上可以搜出很多来,为何要再写一回,实在是因为近年来从网上拷贝了一个几乎的例程用到花色中,运行有标题,后来商量了半天,才解决了那些题材。于是打算写那样一篇博文,一来说说调用一个外部进度这么不难的一件事究竟会有啥难题,二来也冀望我写的那几个相比较较完好的类可以为软件开发的同道们节约一些脑细胞,以便集中优势兵力解决那多少个实在高深复杂的软件难点。
    在开班正题往日,大家先来看一看网上比较常见的实施外部进度的函数

 

图片 1     private string RunCmd(string command)
图片 2图片 3        图片 4{
图片 5            //例Process
图片 6            Process p = new Process();
图片 7
图片 8            p.StartInfo.FileName = “cmd.exe”;           //确定程序名
图片 9            p.StartInfo.Arguments = “/c ” + command;    //确定程式命令行
图片 10            p.StartInfo.UseShellExecute = false;        //Shell的使用
图片 11            p.StartInfo.RedirectStandardInput = true;   //重定向输入
图片 12            p.StartInfo.RedirectStandardOutput = true; //重定向输出
图片 13            p.StartInfo.RedirectStandardError = true;   //重定向输出错误
图片 14            p.StartInfo.CreateNoWindow = true;          //设置置不显示示窗口
图片 15
图片 16            p.Start();   //00
图片 17
图片 18            //p.StandardInput.WriteLine(command);       //也能够用这种措施输入入要行的一声令下
图片 19            //p.StandardInput.WriteLine(“exit”);        //要得加上Exit要不然下一行程式
图片 20
图片 21            return p.StandardOutput.ReadToEnd();        //输出出流取得命令行结果果
图片 22
图片 23        }
图片 24

正文

那么些方法应该是比较广泛的调用外部进度的点子,我原先也直接是如此调用外部进度的,也未曾汇合过怎样难题。但本次调用的表面进度比较万分,用这种艺术调用就涌出了两个难题。
率先个难点是这一个被调用的表面进程有时候会出现非凡,出现极度后Windows会弹出荒唐报告框,程序于是吊死在那边,必须手工干预。那几个题材相比好解决,程序中安装一下注册表搞定。
其次个难点是调用这么些外部进度(是一个操纵台进程)后,程序会阻塞在p.StandardOutput.ReadToEnd();这一句,永远无法出来,被调用的百般控制台程序也被吊死。但该控制台进程在CMD
中是可以正常实施的。后来总的来说有些资料才意识原来原因是出在该控制台程序控制台出口大量字符串,管道重定向后,调用程序尚未当即将管道中的输出数据取出,结果导致管道被封堵,程序吊死。在这里还有别的一个标题,固然本次没有遇到,但网上有其余人碰到,就是错误音讯管道不及时取出数据,也会被封堵,而且一旦要同时取出八个管道的数额,必要求拔取一个扶持线程才能完结。

  一、影视

标题讲完了,下边给出这几个类的完好代码

    1.1  电影、连续剧

图片 25using System;
图片 26using System.Collections.Generic;
图片 27using System.Text;
图片 28using System.Runtime.InteropServices;
图片 29using System.Threading;
图片 30
图片 31namespace Laboratory.Process
图片 32图片 33图片 34{
图片 35    class ReadErrorThread
图片 36图片 37    图片 38{
图片 39        System.Threading.Thread m_Thread;
图片 40        System.Diagnostics.Process m_Process;
图片 41        String m_Error;
图片 42        bool m_HasExisted;
图片 43        object m_LockObj = new object();
图片 44
图片 45        public String Error
图片 46图片 47        图片 48{
图片 49            get
图片 50图片 51            图片 52{
图片 53                return m_Error;
图片 54            }
图片 55        }
图片 56
图片 57        public bool HasExisted
图片 58图片 59        图片 60{
图片 61            get
图片 62图片 63            图片 64{
图片 65                lock (m_LockObj)
图片 66图片 67                图片 68{
图片 69                    return m_HasExisted;
图片 70                }
图片 71            }
图片 72
图片 73            set
图片 74图片 75            图片 76{
图片 77                lock (m_LockObj)
图片 78图片 79                图片 80{
图片 81                    m_HasExisted = value;
图片 82                }
图片 83            }
图片 84        }
图片 85
图片 86        private void ReadError()
图片 87图片 88        图片 89{
图片 90            StringBuilder strError = new StringBuilder();
图片 91            while (!m_Process.HasExited)
图片 92图片 93            图片 94{
图片 95                strError.Append(m_Process.StandardError.ReadLine());
图片 96            }
图片 97
图片 98            strError.Append(m_Process.StandardError.ReadToEnd());
图片 99
图片 100            m_Error = strError.ToString();
图片 101            HasExisted = true;
图片 102        }
图片 103
图片 104        public ReadErrorThread(System.Diagnostics.Process p)
图片 105图片 106        图片 107{
图片 108            HasExisted = false;
图片 109            m_Error = “”;
图片 110            m_Process = p;
图片 111            m_Thread = new Thread(new ThreadStart(ReadError));
图片 112            m_Thread.Start();
图片 113        }
图片 114
图片 115    }
图片 116
图片 117    class RunProcess
图片 118图片 119    图片 120{
图片 121        private String m_Error;
图片 122        private String m_Output;
图片 123
图片 124        public String Error
图片 125图片 126        图片 127{
图片 128            get
图片 129图片 130            图片 131{
图片 132                return m_Error;
图片 133            }
图片 134        }
图片 135
图片 136        public String Output
图片 137图片 138        图片 139{
图片 140            get
图片 141图片 142            图片 143{
图片 144                return m_Output;
图片 145            }
图片 146        }
图片 147
图片 148        public bool HasError
图片 149图片 150        图片 151{
图片 152            get
图片 153图片 154            图片 155{
图片 156                return m_Error != “” && m_Error != null;
图片 157            }
图片 158        }
图片 159
图片 160        public void Run(String fileName, String para)
图片 161图片 162        图片 163{
图片 164            StringBuilder outputStr = new StringBuilder();
图片 165
图片 166            try
图片 167图片 168            图片 169{
图片 170                //disable the error report dialog.
图片 171                //reference: http://www.devcow.com/blogs/adnrg/archive/2006/07/14/Disable-Error-Reporting-Dialog-for-your-application-with-the-registry.aspx
图片 172                Microsoft.Win32.RegistryKey key;
图片 173                key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@”software\microsoft\PCHealth\ErrorReporting\”, true);
图片 174                int doReport = (int)key.GetValue(“DoReport”);
图片 175
图片 176                if (doReport != 0)
图片 177图片 178                图片 179{
图片 180                    key.SetValue(“DoReport”, 0);
图片 181                }
图片 182
图片 183                int showUI = (int)key.GetValue(“ShowUI”);
图片 184                if (showUI != 0)
图片 185图片 186                图片 187{
图片 188                    key.SetValue(“ShowUI”, 0);
图片 189                }
图片 190            }
图片 191            catch
图片 192图片 193            图片 194{
图片 195            }
图片 196            
图片 197            
图片 198            m_Error = “”;
图片 199            m_Output = “”;
图片 200            try
图片 201图片 202            图片 203{
图片 204                System.Diagnostics.Process p = new System.Diagnostics.Process();
图片 205
图片 206                p.StartInfo.FileName = fileName;
图片 207                p.StartInfo.Arguments = para;
图片 208                p.StartInfo.UseShellExecute = false;
图片 209                p.StartInfo.RedirectStandardInput = true;
图片 210                p.StartInfo.RedirectStandardOutput = true;
图片 211                p.StartInfo.RedirectStandardError = true;
图片 212                p.StartInfo.CreateNoWindow = true;
图片 213
图片 214                p.Start();
图片 215
图片 216                ReadErrorThread readErrorThread = new ReadErrorThread(p);
图片 217                
图片 218                while (!p.HasExited)
图片 219图片 220                图片 221{
图片 222                    outputStr.Append(p.StandardOutput.ReadLine()+”\r\n”);
图片 223                }
图片 224
图片 225                outputStr.Append(p.StandardOutput.ReadToEnd());
图片 226
图片 227                while (!readErrorThread.HasExisted)
图片 228图片 229                图片 230{
图片 231                    Thread.Sleep(1);
图片 232                }
图片 233
图片 234                m_Error = readErrorThread.Error;
图片 235                m_Output = outputStr.ToString();
图片 236            }
图片 237            catch (Exception e)
图片 238图片 239            图片 240{
图片 241                m_Error = e.Message;
图片 242            }
图片 243        }
图片 244           
图片 245    }
图片 246}
图片 247

      1.1.1  赤壁2  那个在电影院里看的,感觉相似般,觉得林志玲依然不太符合,包含后来的烂片《刺陵》

      1.1.2  爱情呼叫转移1  果然第一部比第二部美观,觉得还不错。

      1.1.3  卧虎藏龙  当时的觉得是怎么能拿奥斯卡奖,尽管不是烂片,可是没以为很好

      1.1.4  爱的发音操练  美丽的女生徐熙媛(英文名:Barbie Hsu)!有点习惯山东片的品格,有些唯美,有些现实,有些思想

      1.1.5  我的野蛮女友  - – # 好经典啊~~

      1.1.6  小姨的后现代生活  斯琴高娃、周润发先生、赵薇,讲巴黎那里的事,不错
🙂

      1.1.7  叶问  没得说的好片,好情人的说法是有 甄子丹
的名片烂不了。

      1.1.8  猎鹿人  俄罗斯轮盘 令人记念越发深切。

      1.1.9  七金刚  Hong Kong的老片了,好对象推荐的,还行。

      1.1.10  樱之园  东瀛影视,现在预计,和西藏影视某些节奏和感觉很相识。

      1.1.11  贫民窟的赵玄坛  除了叹息一声,还是可以做点什么,可是不会遗忘的。

      1.1.12  纳尼亚传奇2:凯斯宾王子  一般电影

      1.1.13  诺丁山Notting 希尔  不要扬弃

      1.1.14  疯狂大老千  老港片,挺有趣的呵呵

      1.1.15  圆明园  是去圆明园的时候买的碟,挺好的,提议先看片再去看园子,多一份想象。

      1.1.16  死神的精度  金城武先生,很正确,对生命的构思

      1.1.17  早上华盛顿  浪漫、酒、音乐、画、***、三个人共处

      1.1.18  先知  前面不错,烂尾

      1.1.19  救世神棍  老港片

      1.1.20  麦田  尽管是烂片,然则范冰冰(Fan Bingbing)的演技仍旧值得肯定的

      1.1.21  星际迷航  雅观,科幻类的

      1.1.22  时空访客  不怎么雅观,和1.1.12程度大致

      1.1.23  十分周到  不错的名片,章子怡演技果然了得

      1.1.24  倔强萝卜  还不易的搞笑片,郭涛那眼果然比自己还小 –

      1.1.25  终结者2018  科幻的功用不错~~,好片!

      1.1.26  2012  杯具的美利坚合众国管辖,现在过年,不用2012,年年票都难买-

  • #

      1.1.27  和猪猪一起上课的光阴  好有教育意义,好有爱~~

      1.1.28  这些男人来自地球  一个人活着了一万多年,你会怎么想?

      1.1.29  风声  周迅的演技第一,相比较不亮堂的是老大脱光衣裳体检是干嘛?

      1.1.30  费城  爱是足以用来成全Ta的。

      1.1.31  哈利波特(1,2,3)  终于系统的看这一连串片子,尽管有说一部比一部差,那也只是相持吧~

      1.1.32  星球大战(1)  好酷的激光刀,一向觉得知道那部片子确没有看过,比较遗憾,现在拾遗~

      1.1.33  霸王别姬  张国荣先生的片子,好片子!!朋友也援引来着

      1.1.34  Smith夫妇  TV上看的,也很不利~

      1.1.35  八月包围  我觉得一般,觉得李宇春很努力,不过看起来仍然很别扭。

    1.2  动漫、动画片

      1.2.1  海贼王(1-447)  挤了一个多月的业余时间,没办法停下来!!后来才理解周周出一集,已经十年了!

      1.2.2  越狱兔(1-40)   一流搞笑,强烈推荐,笑喷!!

      1.2.3  浪漫鼠Pater罗  很卓越的美国动画片

      1.2.4  马达加斯加2

      1.2.5  机器人总动员  很狼狈!!!适合多人同台看!

      1.2.6  飞屋环游记  不怕拆迁,呵呵

 

  二、 书籍

    2.1  
货币战争  不管是阴谋论也好,警世钟也好,把钱存银行的观念必须改变,必须直面理财和投资,否则你会意识你的钱的数字大了,然则买的东西少了。

    2.2  Head
First设计方式(中文版)  很活跃的例子,有所领,多看看对于写程序如故很有好处的,思维会不雷同的。

    2.3  .NET2.0面向对象编程揭秘  基础方面的,系统的围观了三遍,仍旧小有收获的

    2.4  囚徒的窘况  博弈论,对于有解至极感兴趣,一贯在搜寻互赢。

    2.5  流血的仕途(上、终结版)  假如对秦很感兴趣,又不甘于翻古文,那么这两本书将维妙维肖的为你不断道来,我是一口气看完的。

    2.6  牛奶可乐艺术学  有意思的厂家行为,有种不知不觉的感到。

 

  三、 旅游

    3.1  八大处  很好的地点,好像那里有舍利子,更加是推荐那多少个坐划道,下次去肯定坐。

    3.2  圆明园  望着周围的人很兴高采烈,心绪总是万分,带着双眼左寻又找那历史的印痕,也只好摇摇的走一圈出来,买了张圆明园的碟,忽然感到看完碟后再看或者更好。

 

  四、 工作

    换了两份工作,停止了一年半的创业企业,进入了此外一家创业公司,做游戏支付,一月后大约带着伤离开,印象最深的就是了大约一致的话:“把我们培训成多面手”,连字都不改的!!年末最终八天规定了现在的工作,算是给自家的礼物呢,好好保养。

 

  五、程序笔记

    4.1  本博推荐

      4.1.1  ExtJs系列

      4.1.2  视频监控连串

      4.1.3  动用Visual Studio宏来自动生成代码 [ Visual Studio
| 宏 | 自动生成代码
]

      4.1.4  让Visual Studio 也支撑JS代码折叠 [ Visual Studio
| #region | #endregion
]

      4.1.5  Visual Studio 模板 ——
自定义WebForm模板

      4.1.6  村民公公 谈 接口
[interface]

    4.2  C#点滴小技巧和小知识

在c#中,string对象的==运算已经被强行重写,它就是代表equals,
那就是说,在c#中,完毕字符串值比较的话,只必要写成”hello”==aaa就行了,

这样设计的目标是为了更直观。

万一在艺术前边同时选取protected和internal来安装,那么访问将是他俩的合集,即本程序集内可访问,非本先后集内不过后续了的也可以用

dll->il:ildasm test.dll /out=test.il
//中间做修改

il->dll:ilasm /dll test.il /out=test2.dll

JNBridge  

WeakReference表示弱引用,即在引用对象的同时仍旧允许垃圾回收来回收该目标。
        //Dictionary<K,T>
会自动爱护一个空链表来保存不用的单元。
        //那里,使用被缓存对象的“弱引用”,允许那一个目的被垃圾回收。
        private Dictionary<string, WeakReference> Buffer = new
Dictionary<string, WeakReference>();
        public object this[string key]
        {
            get{
                WeakReference ret;
                if (Buffer.TryGetValue(key, out ret) && ret.IsAlive)
return ret.Target; else return null;
            }
            set{
                WeakReference ret;
                if (Buffer.TryGetValue(key, out ret)) ret.Target =
value; else Buffer.Add(key, new WeakReference(value));
            }
        }
        public void Remove(string key){
            Buffer.Remove(key);

        }

一经 Hashtable 要允许并发读但不得不一个线程写, 要这么创立 Hashtable
实例:
Hashtable hashtable = Hashtable.Synchronized(new Hashtable());
如此, 如若有七个线程并发的图谋写 hashtable 里面的 item,
则同一时刻只可以有一个线程写, 其余阻塞; 对读的线程则不受影响。
要是想锁整个 hashtable, 蕴涵读和写, 即不相同意出现的读和写, 那应该锁
hashtable 实例;
比方想同意现身的读, 不容许现身的写, 这应该成立 Synchronized 的
hashtable, 并对要加锁的一块代码用 SyncRoot 锁住,

只要不必要对一块代码加锁, 则 hashtable 会自动对单个写的操作加锁。

采取DataTable.Columns.Contains方法可以看清某个列名是不是存在于某个DataTable中
DataTable t = new DataTable();
DataColumn col = new DataColumn(“aaa”);
t.Columns.Add(col);
col = new DataColumn(“bbb”);
t.Columns.Add(col);
col = new DataColumn(“c”);
t.Columns.Add(col);

bool b = t.Columns.Contains(“bbb”);

1.1:System.Configuration.ConfigurationSettings.AppSettings

2.0:System.Configuration.ConfigurationManager.AppSettings

ReaderWriterLockSlim

用于管理资源访问的锁定状态,可完结多线程读取或进行独占式写入访问。

C# 检查网络是不是衔接
[DllImport(“wininet.dll”)]
private extern static bool InternetGetConnectedState(out int
connectionDescription, int reservedValue);
private bool IsConnected(){
    int I = 0;
    bool state = InternetGetConnectedState(out I, 0);
    return state;
}
调用方法:

bool state = IsConnected();   //True 为连通   False 为断开

尽可能利用当地配置资源,比如 System.getProperty(“line.separator”)

取而代之手工输入 “\r\n”,以此缓解跨平台难点(Windows、Mac等)

SqlDataReader
对象足以逐行读取数据音信,但如若有10000行数据而大家只愿意读取前边的100行数据,读取完后调用
SqlDataReader.Close 会非凡慢。实际上调用SqlData里德r.Close
时SqlDataReader 会把前边的9900行数据总体读完才截至。
这些标题标解决办法是在SqlDataReader.Close 前调用 SqlCommand.Cancel

,打消当前下令

轻易数种子,用于快捷生产随机数,减弱自由数一样机率
方法1:new Random(Guid.NewGuid().GetHashCode())即可
方法2:
private static int GetRandomSeed()
{
        byte[] bytes = new byte[4];
        System.Security.Cryptography.RNGCryptoServiceProvider rng =
new System.Security.Cryptography.RNGCryptoServiceProvider();
        rng.GetBytes(bytes);
        return BitConverter.ToInt32(bytes, 0);

}

浮点转整型
(int) 默许摒弃小数点后边的
Console.WriteLine(Convert.ToInt32(0.51));    // 1

Console.WriteLine((int)(0.5));            // 0

哪些缓解winform自动缩放发生的布局难点.
将 Form 设置为this.AutoScaleMode =
System.Windows.Forms.AutoScaleMode.None;
上面的控件都安装为

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;

int[,] aArray = new int[3, 3];
for (int i = 0; i < aArray.GetLength(0); i++){      
 //第0维的尺寸
    for (int j = 0; j < aArray.GetLength(1); j++){

        aArray[i, j]

检测文件真实文件类型
读取文件的前多少个字节举行判定
System.IO.FileStream fs = new
System.IO.FileStream(hifile.PostedFile.FileName,
System.IO.FileMode.Open, System.IO.FileAccess.Read);
System.IO.BinaryReader r = new System.IO.BinaryReader(fs);
string fileclass = “”;
byte buffer;
try{
            buffer = r.ReadByte();
            fileclass = buffer.ToString();
            buffer = r.ReadByte();
            fileclass += buffer.ToString();
}catch{ }
r.Close();
fs.Close();
if (fileclass == “255216” || fileclass == “7173”)

//说明255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar

DateTime dt1 = new DateTime(2008, 12, 31);  
DateTime dt2 = new DateTime();  
dt2 = DateTime.Now;  
TimeSpan ts = new TimeSpan(dt2.Ticks – dt1.Ticks);  
//相差天數(未滿一天捨去,return int type)
Response.Write(Convert.ToString( ts.Days ));
//相差天數(未滿一天亦計入,return double type)
Response.Write(Convert.ToString( ts.TotalDays ));
//相差小時數(return double type)
Response.Write(Convert.ToString( ts.TotalHours ));
//相差秒數(return double type)

Response.Write(Convert.ToString( ts.TotalMinutes ));

种类号对象
[Serializeable]
[NonSerialized]
接口IDeserializationCallback
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(writer,Object);//将目的系列号到文件

(Object)formatter.Deserialize(reader)//反种类化

事件集合
EventHandlerList events = new EventHandlerList();
public event DelegateXX Event1
{
    add{ events.AddHandler(“Event1”,value) }
    remove{ events.RemoveHandler(“Event1”,value) }
}

events[“Event1”] as DelegateXX

Process类用于代表托管进度,它事实上封装了操作系统的本地进程,每一个托管进度对象都对应着操作系统真实的本土进度。
Thread类用于表示托管线程,每个托管线程都对应一个函数(“线程函数”),托管线程的履行就是线程函数代码的履行,线程函数执行完,线程也就推行完了。
Thread类与操作系统真实的地头线程不是各种对应提到,它所表示的是一个“逻辑线程”,由CLR负责创立和治本。ProcessThread类用于表示操作系统中实际的本土线程。

Win32 API SetClipboardViewer ChangeClipboardChain
可监控剪切板内容的更动,比如迅雷、电驴

FileSystem沃特cher是.net提供的一个组件,可以监督特定文件夹或文件,引发对应的事件

Marshal 封送

当音信再多个进度间按照COM规范直接传送时,须求在信息的发送进度端将数据打包再发送,而接受新闻的长河在吸收音讯后,要先解包才能博取实在的新闻,这一个历程就叫封送。

Wtypes.h中的非托管类型    非托管C语言类型    .NET托管类名

HANDLE            void*        System.IntPtr
BYTE            unsigned char    System.Byte
SHORT            short        System.Int16    short
WORD            unsigned short    System.UInt16    ushort
INT            int        System.Int32    int
UINT            unsigned int    System.UInt32    uint
LONG            long        System.Int32    int
BOOL            long        System.Int32    int
DWORD            unsigned long    System.UInt32    uint
ULONG            unsigned long    System.UInt32    uint
CHAR            char        System.Char
LPSTR            char*      
 System.String或System.Text.StringBuilder
LPCSTR            Const char*  
 System.String或System.Text.StringBuilder
LPWSTR            wchar_t*  
 System.String或System.Text.StringBuilder
LPCWSTR            Const wchar_t*  
 System.String或System.Text.StringBuilder
FLOAT            Float        System.Single
DOUBLE            Double        System.Double

            signed char    SByte        sbyte

new ThreadStart(delegate{ …代码 });
Thread th1 = new Thread(new ThreadStart(方法名));
th1.Abort()// 提早中止线程
IsBackground = true //设置为背景线程 默许为false
当主线程一为止时,CLR会对属于此进度的有所背景线程调用Abort方法中止
Join可以等待子线程执行已毕
ParameterizedThreadStart 带一个参数的线程委托
也得以传一个类来完结多参数
线程优先级
Thread.Priority
Highest->AboveNormal->Normal->BelowNormal->Lowest

Lock(obj){…}
与Monitor.Enter(obj);

Monitor.Exit(obj);相等

Monitor
紧要用以给共享资源加锁,有限支撑四遍只有一个线程访问共享资源,且只好给引用类型的变量加锁
Mutex 可以一并值类型变量
Semaphore
用于共同两个线程访问同一种类的七个共享资源,即三遍允许不超越共享资源总数的线程投入运作
伊芙ntHandle及其子类AutoReset伊夫nt和ManualReset伊夫nt是最接近“交通讯号灯”作用的联合方法,可用走走停停
ThreadPool提供了有限的线程同步手段,但出于其避免了创立和销毁线程的费用,由此再品质上占优。
若要请求由线程池中的一个线程来拍卖工作项,请调用 QueueUserWorkItem
方法。此格局将对将被从线程池中选定的线程调用的格局或委托的引用用作参数。一个办事项排入队列后就不可能再打消它。
计时器队列中的计时器以及已注册的守候操作也使用线程池。它们的回调函数也会排列到线程池。
每个进度都有一个线程池。线程池的默许大小为各样可用处理器有 25
个线程。使用 Set马克斯Threads
方法可以更改线程池中的线程数。每个线程使用默许的库房大小并根据默许的预先级运行。
ThreadPool.SetMaxThreads(10, 200);ThreadPool.SetMinThreads(2, 40);

ReaderWriterLock 一个线程些,三个线程读(单写多读)
BackgroundWorker 格外适合再后台运行义务、前台突显结果的接纳场景
    RunWorkerAsync 开始
    CancelAsync 中途抛锚 CancellatioinPending将为true
    ReportProgress 报告进程
           ProgressChanged 不用考虑跨线程,可一直访问可视化控件
        e.ProgressPercentage //百分比
        e.UserState //文字音讯

Mutex m = new Mutex();三十二线程下保证一个多少是共同体 安全的  
方法1里面 m.WaitOne()  … m.ReleaseMutex();
方法2里面 m.WaitOne()  … m.ReleaseMutex();
方法3里面 m.WaitOne()  … m.ReleaseMutex();
多少个措施都是三四线程

Semaphore  可以一回使数个线程投入运行
构造函数 initialCount
计数器的初步值,代表空闲的共享资源数目,maximumCount 计数器最大值
进行措施中加 WaitOne  Release

ManualResetEvent 红绿灯
ManualResetEvent mre = new ManualResetEvent(false);
DoWork{  mre.WaitOne(); ..打印当前线程 }
Go{  mre.Set(); ..绿灯 }
Stop{  mre.Reset(); ..红灯 }
软件启动的时候可以用那一个目的,窗体启动前用WaitOne,进入Load后用 Set

线程池默许大小为可用处理器数目 乘以 25,线程池中的线程都是背景线程

yyyy-MM-dd hh:mm:ss.fff

#region Kill Special Excel Process
[DllImport(“user32.dll”, SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int
lpdwProcessId);
#endregion

Excel.Application xlApp = new Excel.Application();

…..导出excel后

if (xlApp != null)

   {
      int lpdwProcessId;
      GetWindowThreadProcessId(new IntPtr(xlApp.Hwnd), out
lpdwProcessId);

     
System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();

   }

泛型方法中利用new()
public static IModelProvider Get<T>() where T : IModel, new()
{
    new T();
    string key = typeof(T).FullName;
    if (!metadatas.ContainsKey(key))
        metadatas.Add(key, new ModelProvider(T));
    return metadatas[key];

}

反射
new StackTrace().GetFrame(1).GetMethod().Name
//取得子类所有TransactionMethodAttribute的措施
foreach (MethodInfo item in this.GetType().GetMethods())
{
    object[] attrs =
item.GetCustomAttributes(typeof(TransactionMethodAttribute), true);
    //if (attrs.Length > 0 && attrs[0] is
TransactionMethodAttribute)
}
//当前方式调用源
StackTrace trace = new StackTrace();
foreach (StackFrame frame in trace.GetFrames())
{
    Console.Write(frame.GetMethod().DeclaringType.Name);
    Console.Write(“:\t”);
    Console.WriteLine(frame.GetMethod().Name);

}

Name为abc的节点 Employee结点
XmlNode emp = xmlDoc.SelectSingleNode(
“/Company/Department/Employees/Employee[Name=’abc’]” );
ID的属性code为2的Employee结点
XmlNode xn =
xmlDoc.SelectSingleNode(@”/Company/Department/Employees/Employee/ID[@code=’002′]/parent::node()”
同一节点下的节点判断

Config/UserList/Group/User[Username='{0}’][Password='{1}’]

特性更改

INotifyPropertyChanged

获得错误信息
innerException比Exception所涵盖的不得了范围小
private static string BuildExceptionMessage(Exception ex)
{
    StringBuilder exceptionMsgs = new StringBuilder();
    while (null != ex) // this is obsolete since we’re grabbing
base…
    {
        exceptionMsgs.AppendFormat(“\n{0}\n{1}\n{2} Soure:{3}”,
ex.GetType().Name, ex.Message,ex.StackTrace,ex.Source);
        ex = ex.InnerException;
        //e.TargetSite 引发此错误的法门
    }
    return  exceptionMsgs.ToString();

}

C#基础
值类型(value type) 有与其对应的默许值 永远无法为null
引用类型(reference type) 默许值 null

意味着尚未点名其他已分配内存的位置

检测回车

e.KeyCode == Keys.Enter

关闭进程最好不要用kill
Processpro = new Process();
pro.Start();

pro.CloseMainWindow();

C# 查找字符串中冒出的子串 “abcdef”.Contains(“abc”)

这么就毫无IndexOf

C# 打开窗口
Process.Start(“main.cpl”);    //打开鼠标设置窗口
Process.Start(“desk.cpl”);    //打开桌面设置窗口
Process.Start(“ncpa.cpl”);    //打开互联网连接窗口
Process.Start(“mmsys.cpl”);    //打开音响设置窗口
Process.Start(“IExplore.exe”,”www.g.cn”);
ProcessStartInfo startInfo = new ProcessStartInfo(“IExplore.exe”);
startInfo.WindowStyle = ProcessWindowStyle.Minimized;  
 //启动后最小化
startInfo.Arguments = “www.sina.com.cn”//自动访问新浪网
Process.Start(startInfo);
startInfo.Verbs 遍历谓词 比如文本文件就有open、print、printto
默许为open,即默许双击文本文件为开辟操作
CloseMainWindow()不会强制应用程序立刻退出,相当于用户直接点击主窗体上的“关闭”按钮,该办法为非阻塞调用。

Kill()直接甘休进程,不会保留数据

C# 调用cmd程序
Process p = new Process();
p.StartInfo.FileName = “cmd.exe”;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();

p.StandardInput.WriteLine(@”netstat -a -n > c:\port.txt”);

C#中各样Lock的进程相比
Interlocked可以直接编译为CPU指令,速度最快,就算效果较少但能用则用。
     Interlocked.Increment(ref seed);
CriticalSection(也就是lock关键字或者Monitor.Enter()方法)仅比Interlocked慢,提出利用。
对于ReaderWriterLock和ReaderWriterLockSlim,Slim快近一倍,但缺点是无法track
owner,也就是同一线程无法屡屡进去同一个lock。Reader比Writer要慢,推断是要保护reader
count的由来。
    ReaderWriterLock

Mutex,Semaphore,伊夫nt就算可以获得lock也要跻身基础形式,所以最慢,要尽量防止使用。

文本遍历
foreach (FileInfo file in  new
DirectoryInfo(rootName).GetFiles(“*.264”,SearchOption.AllDirectories))
{
    dict.Add(file.FullName, file.LastWriteTime);

}

指定同时只好由一个线程执行该方法。静态方法锁定类型,而实例方法锁定实例。

[MethodImpl(MethodImplOptions.Synchronized)]

数字格式化
【<%#Container.DataItem(“price”)%>的结果是500.0000,如何格式化为500.00?】
int i=123456;

string s=i.ToString(“###,###.00”);

[Conditional(“DEBUG”)]

修改VS2005模板
C:\Program Files\Microsoft Visual Studio

8\Common7\IDE\ItemTemplatesCache\Web\CSharp\2052\

格式化百分比
ToString(“0%”)
ToString(“0.00%”)
ToString(“p”) 

 

结束语

  时间:现在都七月了,好多仇敌早已经写完了年底计算,不过这些过年呀,仍然传统一点好,而且相比较满足,气氛也方便,弄得自身妈还以为自家工作好忙

  • -#

  期待:假如顺利过了试用期的话,今年关键应该是手机方面的支出,也会尽力而为的多积累并以种类的主意带给大家,用心来面对和挑衅本命年。

  信心:没有比更好更好,也从未比更坏更坏。如若感到温馨的学历、工作经验不够,不要再去痛悔过去,一定要在乎自己现在是不是努力,若是您现在尽力了,你细心的会发现自己在提升,要是能感到到自己在发展,那么发展就是你的太阳能,为你提供引力。活着就有动力的财力。

  提议:如果项目急着用一些技术,除了要求快捷的学会运用格局以外,一定要抽时间来系统的上学,看看连串小说或连串介绍的书本,哪怕没有已毕职分被骂一次都值得。

  感谢: 取之于园,学之于园,报之于园。

                                                                                 
农民叔叔

                           2010-2-13 23:41:49

  

相关文章