1. 跨进程通信
管道
分为无名管道和有名管道,对数据采用先进先出的方式管理,并严格按顺序操作,管道中的信息只能读一次。管道最大的好处是可以像普通文件一样操作,实现起来比较简单。
消息队列
队列储存了我们需要处理的消息但并不是及时的拿到其处理结果。消息队列是异步的,和信号相比,能传递更多的信息。与管道相比,消息队列提供了有格式的数据。
共享内存
允许多个进程在外部通信协议或同步/互斥机制的支持下使用同一个内存段作为中间介质进行通信,是一种很有效的数据通信方式。
2.获取鼠标或键盘消息以做特殊操作
拦截Windows系统消息,通过重写DefWndProc或WndProc函数实现。
3.C#垃圾回收
对象越新,生存周期越短;
垃圾回收:手动释放:Dispose()或Close(),自动释放:Finalize();
初级程序员最好使用自动释放;
4.内存泄露
分类:
按发生频率分类:常发性、偶发性、一次性;
按发生位置分类:堆栈内存、非托管堆、泄露托管堆;定位内存泄露工具:
CLRProfiler;
dotTrace;
winDbg;
5.类和接口
接口可以看作特殊的抽象类,接口是一种约定和承诺,里面不包含任何具体实现。类里面可以有实现,子类可以直接使用父类提供的功能,但是如果设计有变化需要修改父类,那么所有的子类都会受到影响,而修改接口对子类影响不大,也不用修改子类的代码。
6.WinForm里面获取不到按键事件
重载这个‘protected override bool ProcessCmdKey(ref Message msg, Keys keyData)’就可以了。
7.多线程
创建多线程的方式
Thread,ThreadPool,Parallel,Task。.net4.0之前只能使用Thread和ThreadPool,Parallel和Task是对它们的抽象。
1) Thread:比较灵活,允许创建前台线程,可以设置优先级。
2) ThreadPool:线程池,可以动态调节池里面线程的个数,最多有1023个工作线程,1000个IO线程。
3) Parallel:支持数据(并行的for和foreach)和任务并行(Parallel.Invoke(fun1,fun2))。
4) Task:任务,可以传参并返回结果,可以创建子任务,取消父任务,子任务也会跟着取消。多线程同步
1) Lock: 锁对象,在被锁范围内的代码无法被其他线程访问。被编译器解释为Monitor。
2) Interlocked: 使变量的简单句子原子化,例如改变一个整型的值。
3) Monitor: 锁定一个范围,可以设置超时值。
4) SpinLock: struct,类似Monitor,但开销更小。
5) WaitHandle: 等待信号,解除锁定。
6) Mutex: 互斥量,适合跨进程访问。
7) Semaphone: 信号量。
8) Events: 事件,结束时会发信号。
9) Barrier: 任务合并。
10) ReaderWriterLockSlim: 只有一个写入器能获得锁,可以有多个读取器同时进行读取。
8.反射生成DLL实例失败
检查DLL针对的机器位数。
9.C#打开dbf文件失败
报错:ERROR [IM001] [Microsoft][ODBC 驱动程序管理器] 驱动程序不支持此功能。
解决:将【C:\Windows\SysWOW64】路径下的vfpodbc.dll替换为高版本的(比如6.0)。
10.试图加载格式不正确的程序(DLL)
检查程序CUP位数(32位、64位)。
11.C#反序列化失败
报错:无法找到成员*
可能原因:是否删掉了相关类的属性、或者事件(匿名委托)。