由于多线程可能导致对控件访问的不一致,导致出现问题。C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出异常。
解决办法有两个:
1、不进行线程安全的检查
2、通过委托的方式,在控件的线程上执行
public
partial
class
Form1
:
Form
{
public
Form1
(
)
{
InitializeComponent
(
)
;
//方法一:不进行跨线程安全检查
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
private
void
button1_Click
(
object
sender
,
EventArgs
e
)
{
Thread
th1
=
new
Thread
(
new
ThreadStart
(
CalNum
)
)
;
th1
.
Start
(
)
;
}
private
void
CalNum
(
)
{
//button1.Enabled = false;
int
result
=
0
;
for
(
int
i
=
1
;
i
<
100000000
;
i
++
)
{
result
+=
i
;
}
SetCalResult
(
result
)
;
//button1.Enabled = true;
}
//方法二:检查是否跨线程,然后将方法加入委托,调用委托
public
delegate
void
SetTextHandler
(
int
result
)
;
private
void
SetCalResult
(
int
result
)
{
if
(
label2
.
InvokeRequired
==
true
)
{
SetTextHandler
set
=
new
SetTextHandler
(
SetCalResult
)
;
//委托的方法参数应和SetCalResult一致
label2
.
Invoke
(
set
,
new
object
[
]
{
result
}
)
;
//此方法第二参数用于传入方法,代替形参result
}
else
{
label2
.
Text
=
result
.
ToString
(
)
;
}
}
}
转载地址:http://blog.bossma.cn/winform/winform_csharp_cross_thread_control_invoke/