2017-05-12 112 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));