简单概括VB.NET多线程编程技术
创始人
2024-06-09 04:50:39
0

经过长时间学习VB.NET多线程编程,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。传统的VB.NET多线程编程开发人员已经建立了同步应用程序,在这些程序中事务按顺序执行。尽管由于多个事务多多少少地同时运行使多线程应用程序效率更高,但是使用先前版本的VisualBasic很难建立这类程序。

多线程程序是可行的,因为操作系统是多任务的,它有模拟同一时刻运行多个应用程序的能力。尽管多数个人计算机只有一个处理器,但是现在的操作系统还是通过在多个执行代码片断之间划分处理器时间提供了多任务。线程可能是整个应用程序,但通常是应用程序可以单独运行的一个部分。操作系统根据线程的优先级和离最近运行的时间长短给每一个线程分配处理时间。多线程对于时间密集型事务(例如文件输入输出)应用程序的性能有很大的提高。

但是也有必须细心的地方。尽管多线程能提高性能,但是每个线程还是需要用附加的内存来建立和处理器时间来运行,建立太多的线程可能降低应用程序的性能。当设计多线程应用程序时,应该比较性能与开销。多任务成为操作系统的一部分已经很久了。但是直到最近VisualBasic程序员才能使用无文档记录特性(undocumented)或者间接使用COM组件或者操作系统的异步部分执行多线程事务。.NET框架组件为开发多线程应用程序,在System.Threading名字空间中提供了全面的支持。

本文讨论多线程的好处以及怎样使用VisualBasic .NET开发多线程应用程序。尽管VisualBasic .NET和.NET框架组件使开发多线程应用程序更容易,但是本文作了调整使其适合高级读者和希望从早期VisualBasic转移到VB.NET多线程编程的开发人员。

1多线程处理的优点

尽管同步应用程序易于开发,但是它们的性能通常比多线程应用程序低,因为一个新的事务必须等待前面的事务完成后才能开始。如果完成某个同步事务的时间比预想的要长,应用程序可能没有响应。多线程处理可以同时运行多个过程。例如,字处理程序能够在继续操作文档的同时执行拼写检查事务。因为多线程应用程序把程序分解为独立的事务,它们能通过下面的途径充分提高性能:
◆多线程技术可以使程序更容易响应,因为在其它工作继续时用户界面可以保持激活。
◆当前不忙的事务可以把处理器时间让给其它事务。
◆花费大量处理时间的事务可以周期性的把时间让给其它的事务。
◆事务可以在任何时候停止。
◆可以通过把单独事务的优先级调高或调低来优化性能。明确地建立多线程应用程序的决定依赖于几个因素。多线程最适合下面的情况:
◆时间密集或处理密集的事务妨碍用户界面。
◆单独的事务必须等待外部资源,例如远程文件或Internet连接。

例如,某个应用程序跟随Web页面上的链接并下载符合特定条件的文件。这种应用程序可以同步一个接一个地下载文件或者使用多线程在同一时刻下载多个文件。多线程的方法比同步方法的效率高得多,因为即使某些线程从远程Web服务器上接收到的响应很慢,文件也可以被下载。


2建立新线程

建立线程的最直接的方法是建立线程类的一个新的实例并且使用AddressOf语句替你希望运行的过程传递一个委托。例如下面的代码运行一个作为单独的线程的叫做SomeTask的子过程。

  1. Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask)  
  2. Thread1.Start  ' 这儿的代码立即运行   

这就是建立和启动线程的全部工作。调用线程的Start方法后面的任何代码立即执行,不需要等待前面线程的结束。下表是你能使用的控制单独线程的方法:

控制单独线程

上面的大多数方法字面上容易理解,但是安全点(safe point)的概念对你来说可能是新的。安全点是代码中的某个位置,在这个位置通用语言运行时可以安全地执行自动无用单元收集(garbage collection,释放无用变量并恢复内存的过程)。当调用线程的Abort或Suspend方法时,通用语言运行时分析代码,决定线程停止运行的适当位置。

下表是线程的一些常用的属性:

线程

当建立和管理线程时它的属性和方法很重要。本文的"线程同步"部分将讨论你怎样使用这些属性和方法控制和调整线程。

3线程参数和返回值

前面例子中的线程调用没有参数和返回值。这是使用这种方法建立和运行线程的主要缺点之一。但是,你可以在类或结构体中包装线程,为运行在单独线程上的过程提供和返回参

  1. FriendStrArgAsString  
  2. FriendRetValAsBoolean  
  3. SubSomeTask()'StrArg字段是一个参数  
  4. MsgBox("TheStrArgcontainsthestring"&StrArg)  
  5. RetVal=True'设置返回参数中的返回值  
  6. EndSub  
  7. EndClass'为了使用这个类,设置存储参数的属性或者字段,接着异步调用需要的方法  
  8. SubDoWork()  
  9. DimTasksAsNewTasksClass()  
  10. DimThread1AsNewSystem.Threading.Thread(AddressOfTasks.SomeTask)  
  11. Tasks.StrArg="SomeArg"'设置作为参数使用的字段  
  12. Thread1.Start()'启动新线程  
  13. Thread1.Join()'等待线程1结束'显示返回值  
  14. MsgBox("Thread1returnedthevalue"&Tasks.RetVal)  
  15. EndSub  
  16. ClassTasksClass 

手工建立和管理线程最适合于希望很好地控制细节(例如线程的优先级和线程模型)的应用程序。你可能想象,通过这种方法管理大量的线程是很困难的。在你需要很多线程时考虑使用线程池来减小复杂程度。

【编辑推荐】

  1. 用实例讲述VB.NET Process类
  2. 简单讲述VB.NET表间拖放
  3. 如何掌握强大的VB.NET ReadLine()方法
  4. 两步就可以掌握VB使用ArrayList类
  5. 全方位分析VB.NET编码规范

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...