跨线程操作无效[重复]
Posted
技术标签:
【中文标题】跨线程操作无效[重复]【英文标题】:Cross-thread operation not valid [duplicate] 【发布时间】:2011-06-29 13:51:45 【问题描述】:可能重复:Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on
好的,我知道为什么会出现这个错误:
跨线程操作无效: 从线程访问的控件“Form1” 除了它创建的线程 开。
但是...我怎样才能使它可行?
System.Threading.Thread t = new System.Threading.Thread(()=>
// do really hard work and then...
listView1.Items.Add(lots of items);
lots more UI work
);
t.Start();
我不在乎线程何时或如何完成,所以我并不真正关心任何花哨或过于复杂的 atm,除非在新线程中使用 UI 时它会使事情变得更容易。
【问题讨论】:
这个问题已经被问过很多次了。看看这个:***.com/questions/1523878/…或***.com/questions/1485786/…或***.com/questions/1377529/…或***.com/questions/1397370/…或***.com/questions/4010602/…或***.com/questions/3439065/… +1 @blue,是的,似乎有一整类关于这方面的类似问题都以略有不同的方式提出,但具有相同的核心思想,即必须在同一个线程上执行 UI 操作。 【参考方案1】:当您从另一个线程访问 from 的属性时,会引发此异常。 要解决此问题,至少有 2 个选项。
告诉 Control 不要抛出这些异常(不推荐):
Control.CheckForIllegalCrossThreadCalls = false;
使用线程安全函数:
private void ThreadSafeFunction(int intVal, bool boolVal)
if (this.InvokeRequired)
this.Invoke(
new MethodInvoker(
delegate() ThreadSafeFunction(intVal, boolVal); ));
else
//use intval and boolval
【讨论】:
【参考方案2】:你不能。 UI 操作必须在所属线程上执行。期间。
您可以做的是在子线程上创建所有这些项目,然后调用 Control.Invoke
并在那里进行数据绑定。
或者使用BackgroundWorker
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, e) => /* create items */ ;
bw.RunWorkerCompleted += (s, e) => /* databind UI element*/ ;
bw.RunWorkerAsync();
【讨论】:
啊,太好了。非常感谢@Adam。 可靠的答案,但我很好奇为什么“你不能”是真的。你有进一步的阅读吗?以上是关于跨线程操作无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章
例外:跨线程操作无效:控制'pgImportProcess(进度条)'从一个线程访问,而不是它在[重复]上创建的线程