日期:2014-05-19  浏览次数:20810 次

不是说“A线程不能调用B线程创建的控件吗”?为什么我这样做却没有报错?谢谢·
RT说的是我之前的一个程序,今天才发现这样用   居然没有   报错
------------------------------------
private   void   btnStop_Click(object   sender,   System.EventArgs   e)
{
this.btnStop.Enabled   =   false;
foreach(object   o   in   this._postThreads)
{
PostThread   pt   =   (PostThread)o;
if(pt   !=   null   &&   pt.IsAlive)
pt.Stop();
}
this.lblMsg.Text   =   "正在终止线程... ";
Thread   t   =   new   Thread(new   ThreadStart(StopAllThread));
t.IsBackground   =   true;
t.Start();
}

----------------------------------
private   void   StopAllThread()
{
bool   isOK   =   false;
while(!   isOK)
{
isOK   =   true;
foreach(object   o   in   this._postThreads)
{
PostThread   pt   =   (PostThread)o;
isOK   =   isOK   &&   !   pt.IsAlive;
}
}
this.BindDgResult();
this._postThreads.Clear();
PostThread.Clear();
this.lblMsg.Text   =   "全部线程已终止   ! ";
this.btnBegin.Enabled   =   true;
}
///////////////////////////看上面,在子线程里面有访问主线程创建的控件,可没有报:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”   。但是我在今天的另外一个程序上做相似的工作却有报错,最后是用Invoke委托解决。请问这是为什么?

------解决方案--------------------
vs2003不报错,vs2005报错
------解决方案--------------------
不推荐这么做而已吧?

记得某个文章说是因为winxp的健壮性导致不会出现错误,但有可能发生无法预料的问题。
------解决方案--------------------
谁说不能了?
这个是可以了,只是为了防止控件出现状态不一致以及不同线程争用控件出现死锁而尽量少用。的情况,而尽量少用。

WINDOWS应用程序中,每一个控件对象都有一个InvodeRequired,用于检查是否要通过调用Invoke方法完成其他线程对该控件的操作,如果该属性为真,则说明是其他线程操用该控件,这时可以创建一个委托实例,然后调用控件对像的Invoke方法并传入参数完成相应的操作,否则,可以直接对该控件对象进行操作.从而保证了其他线程操作本线程中的控件