很早以前看Juval Lowy 的.net编程的时候,看到了异步和线程的章节,受益匪浅,刚刚在图书馆看书的 时候突然不知怎么的想到了。。回来总结一下哈~
对于多线程处理,有一个很关键的是资源问题,这个在数据库里经常遇到,有时候在对资源的使用上没有限制的时候,可以用异步
有四种方式
1,等待
2,阻塞
3,循环等待
4,完成时回调(当然推荐这种)
异步使用的是 BeginInvoke() 和 EndInvoke()
当然首先得了解 IAsyncResult 借口类 和 AsyncResult 类 ,详细信息可以查madn
一般简单的异步,可以使用如下形式:
IAsyncResult m_AsyncResult;
m_AsyncResult opp.BeginInvoke(lhs,rhs,null,null);
AsyncResult asyncResult = (AsyncResult )m_AsyncResult;
调用 asyncResult.AsyncDelegate 获得 opp;
result = opp.EndInvoke(m_AsyncResult);
这种方式是你想获得异步结构的时候 就去那结果,但是并不确定,到底是否有没有结果,所以推荐使用 完成时回调函数
代码如下:
opp.BeginInvoke(参数, OnMC, null);
AsyncResult resultobj = (AsyncResult)asyncresult;
BinaryOperation opptmp = (BinaryOperation)resultobj.AsyncDelegate;
result = opptmp.EndInvoke(asyncresult);
//尽早回收资源,避免理论上的资源泄漏 ( 当应用分发异步调用的速度比.net回收资源素缎更快时 ? )
asyncresult.AsyncWaitHandle.Close();
但是更多的时候我们还是的自己进行线程的处理
对于线程处理有很多方法
但是为了避免死锁,要用lock
而lock 其实就是使用了Monitor 监视器
相当于
try
{
Monitor.Enter(obj);
obj.methods();
}
catch
{}
finally
{
Monitor.Exit(ojb);
}
Juval Lowy 提供了一些例子,通过lock(this)来促进松耦合
当然进程还有很多值得研究的东西,比如 使用 .net 的 [Synchronization] 修饰 进行 自动同步。