多线程学习笔记----- 异步委托

  多线程开发的复杂性并不在于线程的创建,而在于如何组织代码,使其很好地控制对共享资源的并发访问。我个人的感觉:首先你要把系统设计成适合并发处理的结构。

  牢牢地记住:

  无法控制底层操作系统和CLR对线程的调度。举例说,创建了一个新线程的代码,但并不能保证这个线程会立刻执行;更准确的说,这段代码仅仅通知操作系统尽快地执行这个线程(通常是线程调度程序给这个线程分配时间)。

  要注意线程的不稳定性和原子操作。(Atomic)Atomic操作是安全的,但.Net中的原子操作很少,甚至来赋值这样的操作都不是原子操作。

  为了异步地调用方法,委托是整个过程大大简化。

  在同步委托中,调用委托的线程会一直等待,直到委托调用完成。

  在异步委托中:

  IAsyncResult 接口 :表示异步操作的状态

  AsyncState: Object AsyncState {get;} 获取用户的定义,限定或包含异步操作的信息

  AsyncWaitHandle : WaitHandle AsyncWaitHandle{get;} 获取用于等待异步操作完成的WaitHandle

  CompletedSynchronously : bool  获取异步操作是否同步完成的指示

  IsCompleted: bool 获取异步操作是否已经完成的指示

 

   AsyncResult 类:封装对委托的异步操作的结果

  AsyncDelegate 属性 获取在其上调用的委托对象

 

  AsyncCallback 委托:异步调用完成时,委托自动调用AsyncCallback对象指定的方法

  public delegate void AsyncCAllback(IAsyncResult ar)

 

:) 学而时习之,不亦悦乎。虽说这些东西都看过,而且看了不是一遍,不过再次重新看过,觉得概念清晰不少,有所收获,心情愉悦。

 

  

  

代码
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"MainThread:{0}", Thread.CurrentThread.GetHashCode());
BinaryDe b
= new BinaryDe(Add);
IAsyncResult iAsyncResult
= b.BeginInvoke(100, 200, CallMethod, "这是一个附加信息");

Console.WriteLine(
"MainThread Continue...");


Console.Read();

}

static int Add(int _a, int _b)
{
Console.WriteLine(
"Thread:{0}", Thread.CurrentThread.GetHashCode());
Thread.Sleep(
5000);
return _a + _b;
}

static void CallMethod(IAsyncResult _ar)
{
Console.WriteLine(
"--------------- Call Back ----------------");
Console.WriteLine(
"Thread:{0}", Thread.CurrentThread.GetHashCode());
Console.WriteLine(
"Call Back:{0}", _ar);
Console.WriteLine(_ar);
Console.WriteLine(
"--------------- Call Back ----------------");

AsyncResult asyncResult
= _ar as AsyncResult;
BinaryDe b
= asyncResult.AsyncDelegate as BinaryDe;
int result = b.EndInvoke(_ar);
Console.WriteLine(
"Result:{0}", result);
string msg = (string)_ar.AsyncState;
Console.WriteLine(
"附加信息:{0}", msg);
}
}

public delegate int BinaryDe(int _a,int _b);

 

 

posted @ 2010-06-12 15:26  向恺然  阅读(226)  评论(0编辑  收藏  举报

我必须说的是:我崇尚开源,但鄙视剽窃。本博客所有引用的图片,文章,和代码,均只作为研究学习使用,不作为商业应用。如果我无意中冒犯了您,请发消息留言,我将立即删除。