C#不同线程间访问控件.pdfVIP

  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#不同线程间访问控件 2009 年10 月29 日星期四 15:46 访问Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的 状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的bug, 包括争用情况和死锁。确保以线程安全方式访问控件非常重要。 .NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题。在调试器中运 行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发 一个InvalidOperationException,并提示消息:“从不是创建控件control name 的线程访 问它。” 此异常在调试期间和运行时的某些情况下可靠地发生。强烈建议您在显示此错误信息时修 复此问题。在调试以.NET Framework 2.0 版之前的 .NET Framework 编写的应用程序 时,可能会出现此异常。 注意 可以通过将CheckForIllegalCrossThreadCalls 属性的值设置为false 来禁用此异常。这会 使控件以与在Visual Studio 2003 下相同的方式运行。 public long str1, str2, str3, str4, str5, sum=0,sum1=0; public void button1_Click(object sender, EventArgs e) { Thread.CurrentThread.Name = 主线程; Thread objThreadOne = new Thread(new ThreadStart(fun1)); objThreadOne.Name = 子线程 1 ; Thread objThreadTwo = new Thread(new ThreadStart(fun2)); objThreadTwo.Name = 子线程2 ; objThreadOne.Start(); objThreadTwo.Start(); objThreadOne.Priority = ThreadPriority.Highest; } void fun1() { str1 = long.Parse(textBox1.Text); str2 = long.Parse(textBox2.Text); lock(this) for (long i = str1; i = str2; i++) { sum = sum + i; } textBox4.Text = sum1.ToString(); } void fun2() { str1 = long.Parse(textBox1.Text); str2 = long.Parse(textBox2.Text); lock (this) for (long i = str2; i = str1; i--) { sum1 = sum1 + i; } textBox5.Text = sum1.ToString(); } private void button2_Click(object sender, EventArgs e) { textBox4.Text = ; textBox1.Text = ; textBox2.Text = ; str1 = 0; str2 = 0; sum = 0; } 报错线程间操作无效: 从不是创建控件“textBox4”的线程访问它。 解决方法有两种,但是推荐第二种方法: 1、System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 2、 因为你这个控件是主线程创建的,它依附于创建窗体的主线程.因此,要在子线程去访问占资 源的类型,我们需要跨线程调用.textBox4.InvokeRequire 用于判断是否需要跨线程,返回 True 为需要跨线程,此时你需要定义一个委托类来将一个含赋值语句的方法封装起来,通过 textBox4.Invoke 来调用这个委托.代码如下: public delegate void SetTextHandler(string text); private void SetText(string text) { if(textBox4.InvokeRequired==true) { SetTextHandler set=new SetTextHandler

文档评论(0)

cjp823 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:7060131150000004

1亿VIP精品文档

相关文档