您的位置:首页 > 其它

线程间操作无效: 从不是创建控件“...”的线程访问它(解决方法)

2011-05-19 10:46 489 查看
1、在Form Load事件中加入

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

是最简单的方式!

2、创建代理

delegate void
SetTextCallback(string
text);

创建和启动线程

this
.demoThread =

new
Thread(new
ThreadStart(this
.ThreadProcUnsafe));

this
.demoThread.Start();

线程中要求改主窗体UI中的text属性

private
void
ThreadProcSafe()

{

this
.SetText("This text was set
safely.");

}

调用窗体中的函数用invoke传递参数

private
void
SetText(string
text)

{

if
(this
.textBox1.InvokeRequired)

{

SetTextCallback d = new
SetTextCallback(SetText);

this
.Invoke(d, new
object[] { text });

}

else

{

this
.textBox1.Text = text;

}

}

3、

{

1.定义 委托

delegate

void
myDelegate(
int
i);

myDelegate mydelegate
=

null
;

2.定义方法,显示消息

public

void
ShowMessage(
int
i)

{

this
.textBox1.Text
=
i.ToString();

this
.progressBar1.Value
=
i;

}

3.定义方法,驱动消息

public

void
MyEvent()

{

for
(
int
i
=

0
; i
<

100
; i
++
)

{

Thread.Sleep(
100
);

this
.BeginInvoke(mydelegate,
new

object
[] {i});

}

}

4: 运行

private

void
button1_Click(
object
sender, EventArgs e)

{

mydelegate
=

new
myDelegate(ShowMessage);

Thread myThread
=

new
Thread(MyEvent);

//
IsBackground 是否后台

//
这个属性很重要 .如果 Thread IsBackground 等于false

//
当线程还没有结束时,你点了关闭按钮

//
将抛出An unhandled exception

//
of type 'System.InvalidOperationException'

//
occurred in System.Windows.Forms.dll 异常

myThread.IsBackground
=

true
;

myThread.Start();

}

}

转自 http://hi.baidu.com/lipan112000/blog/item/7f26d741ecc7d1029313c60d.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐