作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C# 似乎有时会抛出跨线程操作异常。例如,您可以尝试在 Windows 窗体程序中运行此示例代码:
public Form1()
{
InitializeComponent();
Thread setTextT = new Thread(TextSetter);
setTextT.Start();
}
private void TextSetter()
{
//Thread.Sleep(4000);
textBox1.Text = "Hello World";
}
它没有抛出任何异常,一切似乎都工作正常。现在,当您取消注释 Thread.Sleep 行时,它将针对尝试的跨线程访问抛出异常。
为什么会这样?
最佳答案
这是因为跨线程检查仅发生在the window's handle之后已经创建,因为您要检查的是窗口句柄的跨线程访问。当您没有 sleep 时,代码在第一次显示控件之前运行得足够快(第一次显示控件时创建句柄)。
了解是否需要小心 UI 控件的跨线程访问的最简单方法是检查 InvokeRequired
如果属实,您需要调用 Invoke
(或者BeginInvoke
,如果您不想等待它完成)进入创建控件的线程。
关于c# - 什么时候允许跨线程访问,什么时候不允许?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170462/
我是一名优秀的程序员,十分优秀!