30 .net c# user-interface multithreading winforms
可能重复:
跨线程操作无效:从创建它的线程以外的线程访问控件
好的,我知道为什么这会给我这个错误:
跨线程操作无效:控制从其创建的线程以外的线程访问的"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();
Run Code Online (Sandbox Code Playgroud)
我不关心Thread何时或如何完成,所以我并不关心任何花哨或过于复杂的atm,除非在新的Thread中使用UI时会更容易.
Ada*_*kis 25
你不能.必须在拥有的线程上执行UI操作.期.
你可以做的是在子线程上创建所有这些项目,然后调用Control.Invoke并在那里进行数据绑定.
或者使用 BackgroundWorker
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, e) => { /* create items */ };
bw.RunWorkerCompleted += (s, e) => { /* databind UI element*/ };
bw.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)
Ali*_*ori 13
从另一个线程访问from的属性时,抛出此异常.要解决此问题,至少有两个选项.
告诉控制不要抛出这些异常(不推荐):
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
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
40991 次 |
| 最近记录: |