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

需要在子线程中更新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);
        }
    }