C中多线程机制带来异常解决方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C中多线程机制带来异常解决方法

C#中多线程机制带来异常的解决方法   摘要: 用C#进行Windows窗体编程时,如果用到跨线程调用控件时,经常遇到抛出一些异常。而多线程技术在开发一些大中型项目中是经常用的。针对这些异常提出一种用委托方法的解决机制。   关键词: 多线程;C#;异常;委托   中图分类号:TB文献标识码:A文章编号:1671-7597(2011)0320034-01      在构建一些大中型系统时多线程技术往往受到青睐,合理应用能极大提高系统效率。它把一些需要执行较长时间的任务做为进程的一些线程,使它们同时执行,无须用户干预。然而,一旦多线程被使用,在Windows窗体编程中程序往往抛出一些Invalidate Operation的异常。这是因为使用线程操作常常会是复杂而且危险的,因此微软在.NETFramework2.0及以后版本都对线程的操作进行了限制。   1 多线程的概念   在Windows 32平台上,应用程序的宿主是进程,进程是应用程序所占的内存及外部资源的总和。每一个运行的进程都至少有一个主线程,主线程是第一个启动的线程,是从main函数开始的。在主线程之外可以生成若干个其它线程,称为工作者线程,用以在“同一时刻”完成多项任务,如字处理软件可以同时进行打印和编辑操作。像这种在主线程之外引入若干个工作者线程的操作成为多线程机制。   2 多线程的产生   多线程机制下,一个进程由一个主线程和若干个工作者线程组成。应用程序运行时会首先启动主线程即从Main函数开始执行。在主线程执行过程中,其内部代码可根据需要产生多个工作者线程。   工作者线程产生有两种途径:1)通过System. Threading命名空间的Thread类产生,方法格式为Thread threadName=new Thread(new Thread   Start(methodName));threadName为工作者线程名称,methodName为需要执行的方法名称。通过这个语句,我们可以方便地将某个方法作为一个单独的线程处理。2)系统自动分配产生,有些特殊方法或语句在执行过程中会自动产生一个工作者线程。如在通过回调函数取得异步方法执行的结果时,回调方法通常在与主线程不同的线程中执行。   3 异常的产生   .NETFramework2.0前的时代可以通过工作者线程在主线程创建控件,这样操作实质是很危险的,如果有两个或多个线程同时操作某一控件的某状态,则极有可能使该控件的某受控制的状态进入一种无所适从的境地。微软在.NETFramework2.0及以后版本都对线程的操作进行了限制。因此,从不是创建控件的线程访问或操作另一线程中创建的控件,经常引起Invalidate Operation和ArgumentExcepion等异常。下面是一个产生异常的例子,建立一个窗体应用程序项目,命名为MultiThread,主要代码如下。   public partial class Form1 : Form   {   public Form1()   {   InitializeComponent();   Thread newThread = new Thread(new ThreadStart(setText));//产生一个工作者线程   newThread.Start();   }   private void setText()   {   textBox1.Text =“newText”;   }    }   4 异常的解决方法   C#默认不允许一个线程中直接访问或操作另一线程中创建的控件,textBox1在主线程中操作的,因此在newThread线程中操作textBox1是不安全的,抛出异常。应用托管可以很好的解决这一问题。   VS开发环境中,Windows窗体控件的每个控件都有InvokeRequired属性,该属性就是用来检查本控件是否被其他线程调用,当被创建该控件的线程外的其它工作者线程调用的时候InvokeRequired就为true。有了这个属性我们就可以利用它来做判断了。当该属性为true时,我们可以用Windows窗体控件中的Invoke方法结合委托就,可以帮我们完成其他线程对控件的访问和操作。修改后的代码如下,此时没有抛出异常。   delegate void setTextDelegate();//定义委托   public partial class Form1 : Form   {   public Form1()   {   InitializeComponent();   Thread newThread = new Thread(new Thre

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档