- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 持续推动党的创新理论体系化学理化PPT坚持两个结合把握六个必须坚持PPT课件(带内容).pptx VIP
- 第五章幼儿园主题活动的环境创设.pptx VIP
- 中达a600变频器说明书.pdf VIP
- 校园欺凌与初中生心理健康教育的协同发展策略教学研究课题报告.docx
- 老板电器应收账款及优化探究.docx VIP
- 一种柔性翻身多功能护理轮椅床.pdf VIP
- 小学英语与初中英语教学的衔接教学研究课题报告.docx
- 2025【阶跃阻抗低通滤波器的电路模型构建及其参数探析12000字】.docx VIP
- 2025中国银河证券校园招聘5人笔试历年参考题库附带答案详解.docx VIP
- 参加活动的意义班会.pptx VIP
原创力文档


文档评论(0)