完成其他内部依赖完成回调方法时调用完成回调

时间:2014-02-08 15:56:26

标签: c# callback

我有一个方法 myobj_EndInteractionEvt 在事件发生时执行

在大班我注册如下:

//on main class register method passing args like
lo.myobj.EndInteractionEvt += (s, args) => updateInteraction(lo.myobj_EndInteractionEvt(s, args));

//this is called when finish executin "lo.myobj_EndInteractionEvt" 
public void updateInteraction(AOItour  tour)
{
    Console.WriteLine(tour.StateOfAOItour );  
    ClearMsg();
    etc...
} 

在myobj类中,我调用 myobj_EndInteractionEvt ,返回一个对象 AOItour

internal AOItour  myobj_EndInteractionEvt(vtkObject losender, vtkObjectEventArgs e)
{
    //do stuff and return AOItour
    return AOItour;
}

这是有用的(主要是因为我正在使用 vtk ,这需要使用大量的回调),问题来自myobj有另一个回调 angleEndInteractionEvt 在内部更新AOItour

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) {
    //AOItour has been modified, so i would  like to call own "myobj_EndInteractionEvt" 
    // so I can pass 
    // modified AOItour to it and  then  myobj_EndInteractionEvt would return AOI to
    // updateInteraction 
}

如何在 angleEndInteractionEvt 结束时调用回调 myobj_EndInteractionEvt

我试过了

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) {
  //some stuff
  myobj_EndInteractionEvt(sender,e);       
}

它正确地转到myobj_EndInteractionEvt,但问题是在执行之后,程序返回到angleEndInteractionEvt并且没有去 updateInteraction 如何做到这一点?

2 个答案:

答案 0 :(得分:1)

myobj_EndInteractionEvt是一种方法,而不是一种事件。您需要触发在主类中调用它的事件,而不是直接调用myobj_EndInteractionEvt(sender,e);。因此,请将angleEndInteractionEvt更改为:

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) {
  //some stuff
  EndInteractionEvt(sender, e);       
}

答案 1 :(得分:1)

您需要触发您已连接的事件。理解你的结构有点困难但通常你会在你定义事件的班级中这样做:

public class MyObj
{
   public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) {
      // Do stuff
      if(EndInteractionEvt != null) {
         EndInteractionEvt(sender, e);
      }
   }
}

但通常情况下,发件人应 - 触发事件的实例。

此时,以下行将开始发挥作用:

lo.myobj.EndInteractionEvt += (s, args) => updateInteraction(lo.myobj_EndInteractionEvt(s, args));

首先将调用myobj_EndInteractionEvt方法,该方法应该返回AOITour。

internal AOItour  myobj_EndInteractionEvt(vtkObject losender, vtkObjectEventArgs e)
{
    //do stuff and return AOItour
    return AOItour;
}

然后应该将结果传递给我在下面列出的updateInteraction,这样你就可以开始记录了。

public void updateInteraction(AOItour  tour)
{
    Console.WriteLine(tour.StateOfAOItour );  
    ClearMsg();
    etc...
} 

可能更好,更具可读性(如果它们是在同一个对象上定义的)则只需执行以下操作:

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) {
   // Do stuff

   this.myobj_EndInteractionEvt(sender, e);
   if(EndInteractionEvt != null) {
         EndInteractionEvt(sender, e);
   }
}