none
silverlithg新问题 RRS feed

  • 问题

  • 今天还发现一个问题,觉得应该是Bug
       this.pWork.Children.Clear();
       this.pWork.Children.Add(new SLUI.HR.HRMain());
    它并没有真正删除掉前一个HRMain实例,下一个新的HRMain实例还有上一个实例的状态
    • 已移动 Raymond TangModerator 2009年9月8日 4:27 Silverlight相关 (发件人:.NET Framework 一般性问题讨论区)
    2009年9月8日 4:16

答案

  • 这个问题我找到了,因为EMS.SLCore.EMSSvc.Proxy.SearchOfficeSCompleted 是个静态类,每次都是+=, 执行几次,就加上了几个...是我自己犯了错
    • 已标记为答案 好名字 2009年9月8日 7:37
    2009年9月8日 7:37

全部回复

  • Clear() 只是清除掉pWork.Children集合所呈现的内容,并不会清掉HRMain实例.
    2009年9月8日 4:56
  • 你这个HRMain初始化时候调用了某个全局或静态变量了吧?

    新new的一个实例不能够还是上一个实例。

    HRMain myHRMain = new HRMain()

    public void MyFunctionName()
    {
    pWork.Children.Add(myHRMain );
    pWork.Children.Clear();
    }
    这样是不会析构myHRMain 的。
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年9月8日 5:18
    版主
  •  this.pWork.Children.Clear();
       this.pWork.Children.Add(new SLUI.HR.HRMain());

    就是这样写的,没有在外部保持句柄,在HRMain中的一个方法中,确实调用到一个静态变量,但也是一调用就丢弃了,它本身没有静态变量。

    恩,那就应该在程序初始化的时候重置这个静态全局变量,要不然只能说程序还不够规范哦。

    不能够程序初始化方法一样,同一个程序里,初始的效果却不一样,那就加参数传进去,这种耦合应该去掉。
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
    2009年9月8日 5:42
    版主
  • 刚才仔细查了下,不是实例的问题,而是异步调用的问题
     public HRMain() {
       InitializeComponent();
    this.BindOffice();
      }


      void BindOffice() {
      MessageBox.Show("Init BindOffice Start");    
       EMS.SLCore.EMSSvc.Proxy.SearchOfficeSCompleted +=
        (object sender, EMS.SLCore.SVC.SearchOfficeSCompletedEventArgs e) => { this.Dispatcher.BeginInvoke(delegate {
          MessageBox.Show("Init BindOffice");    });
      };

       EMS.SLCore.EMSSvc.Proxy.SearchOfficeSAsync();
      }

     
    需要说明的是,这是一个usercontrol类, 是由一个主页面,MainPage,负责调用装载的,装载方法如下:
       this.pWork.Children.Clear();
       this.pWork.Children.Add(new SLUI.HR.HRMain());

    调试结果:
    第一次点击菜单装载Hramin是正确的,MessageBox.Show("Init BindOffice Start");    MessageBox.Show("Init BindOffice");各显示一次。

    第二次再同样操作点击主页面的菜单,装载HRMain, MessageBox.Show("Init BindOffice Start"); 1 次
       MessageBox.Show("Init BindOffice"); 显示2次

    第三次同样操作
       MessageBox.Show("Init BindOffice Start"); 1 次
        MessageBox.Show("Init BindOffice"); 显示3次

    没有进行第4次操作,可以看出同步调用显示MessageBox.Show("Init BindOffice Start"); 是正确的,但异步的MessageBox.Show("Init BindOffice"); 就是错的
     谁能帮我解决一下

    2009年9月8日 6:58
  • 这个问题我找到了,因为EMS.SLCore.EMSSvc.Proxy.SearchOfficeSCompleted 是个静态类,每次都是+=, 执行几次,就加上了几个...是我自己犯了错
    • 已标记为答案 好名字 2009年9月8日 7:37
    2009年9月8日 7:37
  • 容器集合的ADD操作是不会重新实例化现有容器中的类型的,另外HRMain这个UserControl在初始化的时候第一次没问题我觉得就不该是UserControl的事情了.问题应该出在你MainPage调用时候的代码上.

     SLUI.HR.HRMain _hrmain = new  SLUI.HR.HRMain();
     this.pWork.Children.Clear();
     this.pWork.Children.Add(_hrmain);

    这样是否OK呢?

    2009年9月8日 7:41
  • 这个问题的原因我上面说到了!
    我为了提高效率,用静态的EMS.SLCore.EMSSvc.Proxy引用了代理类,但我们程序中每次都是用 += 给异步事件赋值,每run 一次,这个事件就会多一个,就是这个原因。

    现在我在想,如何去检查是不是已给这个代理事件赋值了呢?? 难道 每次 +=之前,先调用一次 -=, 再+=, 是不是显的有些啰嗦?
    2009年9月8日 7:50
  • 其实如果你只想在Children集合内存在一个HRMain对象的话可以判断下是否有这个类型,如果有就可以拿到类型刷新下不必每次都清掉重新装载.
    2009年9月8日 7:57