关于C# 多线程编程的委托

a220315410 2010-09-08 09:22:38
理论上来说,多线程的情况下,副线程对于界面UI控件的访问是需要通过写委托,交给主线程,也就是UI线程来实现的。
但是我实际编码过程中,我发现,如果在副线程中写委托而直接方位UI控件,这种情况下,在VS的调试模式下,会提示无法在非创建UI的线程中访问UI资源。但是,如果不是通过VS来调试,而是直接在debug文件夹下双击EXE文件执行的话,程序是可以正常执行的。
虽说这种违规的操作带来了很大的危险性,但是毕竟在控制好访问时机的情况下,是可行的(虽然很难控制就是了)。
请哪位大牛,能够解释下原因:为什么系统会允许跨线程访问UI资源。
...全文
170 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
a220315410 2010-09-09
  • 打赏
  • 举报
回复
谢谢各位的指导,再此结贴~
wuyq11 2010-09-08
  • 打赏
  • 举报
回复
当您在 Visual Studio 调试器中运行代码时,如果您从一个线程访问某个 UI 元素,而该线程不是创建该 UI 元素时所在的线程,则会引发 InvalidOperationException。调试器引发该异常以警告您存在危险的编程操作。UI 元素不是线程安全的,所以只应在创建它们的线程上进行访问
创建窗体之后的线程成为UI线程,拥有消息循环,因此与普通线程相比,它是“特殊”的
bloodish 2010-09-08
  • 打赏
  • 举报
回复
原因很简单,就因为你是调试状态,VS的调试器能够捕获并抛出InvalidOperationException异常.

你可以尝试一下,在VS调试以及单独执行Debug程序下显示一下
Debugger的IsAttached属性,比如设置Form的Text为

this.Text = System.Diagnostics.Debugger.IsAttached.ToString();

你会发现,VS调试状态下this.Text="True",直接运行Debug程序则是this.Text="False"

建议你如果在线程中要操作UI元素,用Control.Invoke
xu56180825 2010-09-08
  • 打赏
  • 举报
回复
本来就是可以的。。只是为了控件正常执行,不允许这样操作。。可以屏蔽掉错误的

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧