线程
线程是程序中独立的指令流。使用 C#编写任何程序时,都有一个入口点:Main()方法。程序从 Main()方 法的第一条语句开始执行,直到这个方法返回为止。 这种程序结构非常适合于其中有一个可识别的任务序列的程序,但程序常常需要同时完成多个 任务。线程对客户端和服务器端应用程序都非常重要。在 Visual Studio编辑器中输入 C#代码 时,系 统会分析代码,用下划线标出遗漏的分号或其他语法错误,这用一个后台线程完成。McrosoftWord 程、任务和同步 ! I 第Ⅲ部分 基 础 的拼写检查器也会做相同的事。一个线程等待用户输入,而另一个线程进行后台搜索。第 3个线程 将写入的数据存储在临时文件中,第 4个线程从htemet上 下载其他数据。 运行在服务器上的应用程序中,等待客户请求的线程,称为侦听器线程。只要接收到请求,就 把它传递给另一个工作线程,之后继续与客户通信。侦听器线程会立即返回,接收下一个客户发送 的下一个请求。 进程包含资源,如 Whdow句柄、文件系统句柄或其他内核对象。每个进程都分配了虚拟内存。 一个进程至少包含一个线程。操作系统会调度线程。线程有一个优先级、实际上正在处理的程序的 位置计数器、一个存储其局部变量的栈。每个线程都有自己的栈,但程序代码的内存和堆由一个进 程的所有线程共享。这使一个进程的所有线程之间的通信非常快=一该进程的所有线程都寻址相同 的虚拟内存。但是,这也使处理比较困难,因为多个线程可以修改同一个内存位置。 进程管理的资源包括虚拟内存和Window句柄,其中至少包含一个线程。线程是运行程序所必需的。
异步委托。创建线程的一种简单方式是定义一个委托,并异步调用它。委托是方法的类型 安全的引用。Delegate类 还支持异步地调用方法。在后台,Delegate类 会创建一个执行任务的线程。
为了说明委托的异步特性,从一个需要一定的时间才能执行完毕的方法开始。TakesWhile()方法至少需要经过第 2个变量传递的毫秒数才能执行完,因为它调用Thread.Sleep()方法:
static int TakesWhlie(int date, int ms)
{
Console.WriteLine(“TakesWhile started”);
Thread.Sleep(ms);
Console.WriteLine(“TakesWhile completed”);
return ++date
}
要从委托 中调用这个方法 ,必 须定义一个有相 同参数和返回类型的委托 ,如 下面的 TakesWhileD elegateO方法所示:
public delegate int TakesWhileDategete(int data, int ms);
现在可以使用不同的技术异步地调用委托,并返回结果
等待句柄. 等待异步委托的结果的另一种方式是使用与 IAsyncResult相 关联的等待句柄 。使用AsyncWaitHandle属性可以访问等待句柄。这个属性返回一个WaitHandle类型的对象,它可以等待 委托线程完成其任务。而WaitOne()方法将一个超时时间作为可选的第一个参数,在其中可以定义要等 待的最长时间。这里设置为50毫秒。如果发生超时,WaitOne()方法就返回false,while循环会继续 执行。如果等待操作成功,就用一个中断退出while循环,用委托的EndInvoke()方法接收结果。从UI的立场来看,结果与前面的示例类似,只是用另一种方式执行等待操作。
异步回调. 等待委托的结果的第 3种方式是使用异步回调。在BeginInvoke()方法的第 3个参数中,可 以传 递一个满足AsyneCallback委托的需求的方法。AsyneCallback委托定义了一个 IAsyncRcsdt类型的参数,其返回类型是void. 。这里,把TakesWhileCompleted()方法的地址赋予第 3个参数,它满足AsyneCallback委托的需求。对于最后一个参数,可 以传递任意对象,以便从回调方法中访问它。传递委托实例很有用,这样回调方法就可以使用它获得异步方法的结果。现在,只要 Take跛ⅧⅡleDelegate委 托完成其任务,就调用 Take讼WⅢeCompletedO方 法。不需 要在主线程中等待结果。但是在委托线程的任务未完成之前,不能停止主线程,除非主线程结束时 停止的委托线程没有问题。
TakesWhileCompleted()方法用AsyneCallback委 托指定的参数和返回类型来定义。用BeginInvoke()方法传递的最后一个参数可以使用狂Asyncstatc读取。在TakesWhileDelegate委托中, 可以调用Endhvokeo方法来获得结果。
线程与委托
最新推荐文章于 2022-11-25 21:44:40 发布
本文介绍了线程的概念及其在C#中的应用,包括服务器程序中的侦听器线程和工作线程。同时,讲解了如何通过异步委托创建线程,如TakesWhileDelegate方法的定义和调用,以及三种等待异步委托结果的方式:等待句柄、异步回调。文章强调了线程间通信的快捷性,但也指出多线程修改同一内存位置可能带来的处理难度。
1578

被折叠的 条评论
为什么被折叠?



