多线程学习笔记----- 异步委托
多线程开发的复杂性并不在于线程的创建,而在于如何组织代码,使其很好地控制对共享资源的并发访问。我个人的感觉:首先你要把系统设计成适合并发处理的结构。
牢牢地记住:
无法控制底层操作系统和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);