日期:2014-05-18  浏览次数:20664 次

小问题,解决后立刻结帖:窗体Hide情况下不能跨线程响应UI更改
关于跨线程更改UI的控件文本,MSDN2005给出了使用delegate   void   SetTextCallback(string   text)和SetText函数的例子,但是我发现如果在窗体Load时,将窗体隐藏this.Hide();后,SetText函数有时无法被调用,而有时又可以,请高手指教这是怎么回事,谢谢。

------解决方案--------------------
up
------解决方案--------------------
多线程中是不允许在线程中给UI控件付值得,要修改UI空间需要使用代理
比如要对txtWord控件付值,首先定义代理:
private delegate void deleThread(string word);
在线程中写:
this.txtWord.BeginInvoke(new deleThread(SetTxt), word.Trim());

然后定义一个委托方法来付值
private void SetTxt(string word)
{
this.txtWord.Text = word.Trim();
}
------解决方案--------------------
加了断点要按F5继续执行阿 否则线程肯定挂起了。另外如果用隐藏有问题 你可以试试通过设置窗口的Top属性来达到隐藏的效果,把Top设置为-1000就会隐藏了
------解决方案--------------------
参见MSDN2005的Control.InvokeRequired 属性,“注意”栏:如果应当处理消息的线程不再处于活动状态,则可能会引发异常。另外,如果尚未创建控件的句柄,您就不能简单地在控件上调用属性、方法或事件。这可能导致在后台线程上创建控件的句柄,从而隔离不带消息泵的线程上的控件并使应用程序不稳定。
猜想可能是由于窗体不可见后,处理消息的UI线程未处于Running状态引起的不稳定。