本帖最后由 ro4ters 于 2014-2-21 00:42 编辑
- - 写了个基于三层的聊天软件,服务端和客户端写一起了.这下遇见个犯2的问题,
底层解包以后通知UI更新界面.....
最终还是决定用委托吧,(如果用事件是不是会更好?)
问题来了,自定义类里面木有invoke方法.也就是说我要跨线程访问主线程UI(异步socket会自己产生多线程)....
2了.当然最简单的办法就是主线程加Control.CheckForIllegalCrossThreadCalls=false;
这东西大微软都说了不是什么好方法,会引发未知异常...
几番搜索无果..
说说原本结构:
Mode里面加了个委托,并声明了一个静态的委托变量,
主线程实例化变量(指向test2方法)传递更新控件方法.
这样就会抛跨线程访问的异常...
换了个思路想了下,既然结果是另一条线程传递过来的,那么我就让创建控件的线程去更新它!
其实就是再主线程声明一个委托,专门用来调用方法更新,
于是乎加了方法2,里面调用控件的invoke方法!异常解决...
代码如下
[C#] 纯文本查看 复制代码
public delegate void dele(string str);//主线程委托,用来更新自定义类委托传递来的值
//更新显示内容
public void test1(string str)
{
labtest.Text += str + "\r\n"; // labtest.Text += str + "\r\n"; 如果子类 直接调用mode中静态的委托,这里会异常
}
//再实例化一个委托
public void test2(string str)
{
d = new dele(test1);
labtest.Invoke(d,str);
}
也算是给小伙伴们教一招在自定义类里面如何更新主界面..虽然方法二了点...如果有啥更好的方法请告知,不胜感谢....!
HaveFun..
by:Ro4ters
21-02/2014
|