科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual Basic .NET实现后台处理(上)

Visual Basic .NET实现后台处理(上)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

多线程使应用程序具有在同一时刻处理多个事务的能力。使用多线程,可以一个线程运行用户界面,同时另一个线程在后台做复杂的计算或处理。

作者:陶刚编译 来源:yesky 2007年11月10日

关键字: Visual Basic 后台处理

  • 评论
  • 分享微博
  • 分享邮件
多线程使应用程序具有在同一时刻处理多个事务的能力。使用多线程,可以一个线程运行用户界面,同时另一个线程在后台做复杂的计算或处理。Microsoft Visual Basic .NET支持多线程,因此,我们可以轻易的实现这种能力。

  不幸的是,多线程也有它不利的一面。任何时候某个应用程序使用的线程多于一个时,如果多个线程在同一时刻试图使用相同的数据或资源,可能出现麻烦。这种情况一旦出现,程序将变得非常复杂并且难以调试。

  更糟的是多线程代码经常在最初开发时运行良好,在形成产品时却往往失败,原因在于有未被发现的多个线程与相同的数据或资源相互作用的情况。这使得多线程编程非常危险。

  由于设计和调试多线程应用程序的困难性,微软提出了单线程单元(STA)的概念。Visual Basic 6代码通常在STA中运行,因此代码只需要考虑一个线程。这完全的避免了共享数据和资源的问题,但也意味着我们如果不使用其它技术就无法实现多线程。

  在.NET中没有类似STA的东西。所有的.NET代码在AppDomain中运行,而AppDomain允许使用多线程。这意味着Visual Basic .NET代码也在AppDomain中运行,因此我们从多线程中受益。很明显,任何时候我们设计多线程应用程序,都必须小心编写代码以避免线程之间的冲突。

  最简单的避免线程冲突的的方法是使线程之间永远不与相同的数据或资源交互。但这不一定可行,对任何多线程程序来说,避免或最小化共享数据或资源应作为一个目标。

  这不但简化了编码和调试,而且增强了性能。为了解决线程间冲突的问题,我们必须使用同步技术,但同步技术常常引起某个线程阻塞或临时停顿,直到另一个线程完成某个动作。阻塞一个线程意味着让它空闲着,没有工作,降低了性能。

  “取消”按钮和状态显示

  在应用程序中使用多线程的原因很多,最普通的原因是要执行一个需要长时间运行的事务,并且希望用户界面与使用者保持响应。

  至少,我们通常用一个“取消”按钮来响应用户,这样用户才能表示他们想中断某个事务。

  在Visual Basic 6中,我们使用DoEvents和计时器控件和其它工作区的宿主来实现这种功能。在Visual Basic .NET中,这非常简单,因为我们可以使用多线程,只要小心,我们实现该功能根本不会增加代码和调试的复杂性。

  在多线程环境中成功实现“取消”按钮的关键在于要记得该按钮仅仅请求事务被终止。是后台事务自己在适当的时候停止。

  如果我们实现的“取消”按钮直接停止后台处理,可能会在一些敏感操作的中间停止了它,或在它关闭某些类似文件句柄或数据库连接等重要的资源前停止了它。这可能是致命的,会造成死锁,应用程序行为将变得不稳定或直接中断。

  作为该方法的代替,“取消”按钮应该是请求后台事务停止。后台事务能在适当时候检查是否有“取消”请求。当后台线程检测到“取消”请求,便释放所有资源,停止临界活动并温和地终止。

  尽管查询“取消”操作很重要,但是我们更希望用户界面(UI)能给使用者显示后台处理的状态信息。这种显示可以是文本信息或完成百分比,或两者都有。

  在Visual Basic .NET实现“取消”按钮或状态显示所面临的复杂因素在于Windows Forms库不是线程安全(thread-safe)的。这意味着只有创建窗体的线程能访问该窗体和窗体的控件。其它线程不能安全的与该窗体或它的控件交互。

  这意味着我们写代码时必须非常小心,保证只有我们的UI线程与该UI交互。为了确信这一点,我们可以建立一个简单的框架来管理后台工作线程与该UI线程的交互。如果我们做对了,结果便是我们使用的线程与UI代码和长时间运行事务的代码明显相关。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章