首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

需要在子线程中更新UI的地方过多,写那很多delegate太麻烦,如何办

2011-12-13 
需要在子线程中更新UI的地方过多,写那很多delegate太麻烦,怎么办?我先把程序的所有功能写成一个dll,然后做

需要在子线程中更新UI的地方过多,写那很多delegate太麻烦,怎么办?
我先把程序的所有功能写成一个dll,然后做界面.
界面调用dll中的方法来实现程序的功能.
dll中的事件来通知界面层更新界面,如此如此........

问题1:大家是不是都是这样写程序的啊?呵呵,我是新手.

由于在dll中事件的触发都是在子线程中触发的.
那么到了界面层都需要用到委托然后this.Invoke....才能完成更新界面.
每个事件的参数都不一样,那么我就要写不同的委托.

如果事件非常非常的多,那么我就要写好多好多个委托.
然后在构造函数中定义好多好多个委托对象.
再实例化这好多好多个委托对象.

问题2:这样一来就好乱哦.那么比较正规的做法是什么呢?

[解决办法]
由于在dll中事件的触发都是在子线程中触发的.
这个做法一般是错误的,正确的做法是发布的事件要是在创建该对象的线程中触发

东西给别人用,别人不可能还去用Thread.Current来测试一下你的事件是不是在当前线程触发的。。。

正确做法:

C# code
    class TestClient    {        private Thread workThread;        private SynchronizationContext mainThreadSynContext;        public event EventHandler Connected;        public TestClient()//构造函数当然是主线程执行的        {            mainThreadSynContext = SynchronizationContext.Current;            workThread = new Thread(new ThreadStart(DoWork));        }        private void OnConnected(object state)//由于是主线程的同步对象Post调用,这个是在主线程中执行的        {            if (Connected != null)                Connected(this, EventArgs.Empty);        }        private void DoWork()//这个是workThread线程执行的        {            //这儿做些事(连接什么的。。。)            //这而干完了            if (Connected != null)                mainThreadSynContext.Post(new SendOrPostCallback(OnConnected), null);        }    } 

热点排行