2017-05-12 63 views
-5

你好其他程序员事件破坏了函数的结果

我正在写一个程序给C#,它管理TAPI库。我不会给代码(除非有人要求),因为它有一个名为Softone的软件的命令,并且与业务相关。我面临的问题如下:

我想例如当一个调用来执行一个函数。 非常简单。因此,我设置了事件hanlder并调用该函数,但在运行时,它提供给我提到的程序(Softone)的结果是错误的。无论手动执行还是以其他任何方式执行相同的功能都会得到正确的结果我试图禁用事件处理程序,执行函数,并重新激活事件处理程序。但这也是一个失败。

我想要的是另一种防止事件伪造他功能数据的方法。你有什么建议吗?

我是初学者,所以请理解。谢谢:)

 static public void RegisterTapi() 
    { 
     tapi.Initialize(); 
     tapi.EventFilter = (int)(
     TAPI3Lib.TAPI_EVENT.TE_CALLNOTIFICATION | 
     TAPI3Lib.TAPI_EVENT.TE_CALLINFOCHANGE | 
     TAPI3Lib.TAPI_EVENT.TE_DIGITEVENT | 
     TAPI3Lib.TAPI_EVENT.TE_PHONEEVENT | 
     TAPI3Lib.TAPI_EVENT.TE_CALLSTATE | 
     TAPI3Lib.TAPI_EVENT.TE_GENERATEEVENT | 
     TAPI3Lib.TAPI_EVENT.TE_GATHERDIGITS | 
     TAPI3Lib.TAPI_EVENT.TE_REQUEST); 

     tapi.ITTAPIEventNotification_Event_Event += new TAPI3Lib.ITTAPIEventNotification_EventEventHandler(TapiCall.tapi_ITTAPIEventNotification_Event_Event); 
    } 



     public static void tapi_ITTAPIEventNotification_Event_Event(TAPI3Lib.TAPI_EVENT TapiEvent, object pEvent) 
     { 


      switch (TapiEvent) 
      { 
       case TAPI3Lib.TAPI_EVENT.TE_CALLNOTIFICATION: 

       ITCallNotificationEvent tcallNotificationEvent = (TAPI3Lib.ITCallNotificationEvent)pEvent; 
       TAPI3Lib.ITCallInfo a = tcallNotificationEvent.Call; 

       switch (a.CallState) 
       { 
        case TAPI3Lib.CALL_STATE.CS_OFFERING://A new call has appeared 
         tapi.ITTAPIEventNotification_Event_Event -= TapiCall.tapi_ITTAPIEventNotification_Event_Event; 
         ActionOffering(); 
         tapi.ITTAPIEventNotification_Event_Event += TapiCall.tapi_ITTAPIEventNotification_Event_Event; 
         break; 
       } 
       break; 
      } 
      break; 
     } 


    public static void ActionOffering() 
    { 
     string sqa_action = *SQL QUERY* 
     XTable ds_action = XSupport.GetSQLDataSet(sqa_action, null); 
     if (ds_action.Count > 0) 
     { 
      string caller_action = ds_action.Current["ACTION"].ToString(); 

      XSupport.ExecS1Command(caller_action, null); 
     } 
    } 
+0

事件是否被另一个线程触发?如果是这样,您可能需要切换回主线程。 –

+3

最好在那里放一些审查代码,以便我们可以看到发生了什么。 –

+0

非常感谢您的快速回复。我会在一分钟后发布代码。而且我会检查线程建议 –

回答

0

由于FelixCastor建议,我检查中,我调用该函数运行,并没有在同一线程上运行的线程。我在代码中所做的更改非常小。

我在我知道的代码段中声明调度程序将由主线程执行。

public static Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

我这样做是因为,根据dοcumentation调度会的线程上“跑”即宣告。所以如果我想在主线程上运行这个函数,我必须在那里声明它。然后我写了这个简单的代码行,强制ActionOffering函数在调度器(主)线程上运行。

dispatcher.BeginInvoke(new InvokeDelegate(ActionOffering));