2017-05-12 8 views
-5

안녕하세요 동료 프로그래머이벤트가 함수의 결과를 손상시킵니다.

저는 TAPI 라이브러리를 관리하는 C# 프로그램을 작성하고 있습니다. Softone이라 불리는 소프트웨어에 대한 명령이 있고 사업과 관련되어 있기 때문에 코드를 제공하지 않을 것입니다. 내가 직면하고있는 문제는 다음과 같습니다.

예를 들어 기능을 수행하기 위해 호출이 왔을 때를 원합니다. 아주 간단합니다. 그래서 이벤트 hanlder 설정하고 함수를 호출하지만 그것은 내가 언급 (Softone) 프로그램에주는 결과를 실행하는 동안 잘못입니다. 동일한 기능이 수동으로 실행 되든 다른 방법으로 실행 되든간에 올바른 결과를 제공합니다. 이벤트 처리기를 사용하지 않도록 설정하고 함수를 실행 한 다음 이벤트 처리기를 다시 활성화하려고했습니다. 그러나 이것은 또한 실패입니다.

이벤트가 자신의 기능을 위조하지 못하도록하는 또 다른 방법이 있습니다. 제안 할 것이 있으십니까?

저는 초보자입니다. 이해 해주십시오. FelixCastor 제안으로 감사합니다 :)

 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

, 나는 내가 전화 한 기능이 실행되고 동일한 스레드에서 실행되지 않은있는 스레드를 확인했습니다. 코드에서 변경 한 내용은 매우 작았습니다.

나는 주 스레드에서 실행할 코드 섹션의 디스패처를 선언했습니다.

public static Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

나는 디스패처가 스레드에서 "실행"선언 할 dοcumentation에 따르면,이 때문에 않았다. 따라서 메인 스레드에서 함수를 실행하려면 거기에 선언해야합니다. 그런 다음 Dispose (main) 스레드에서 ActionOffering 함수가 실행되도록하는 간단한 코드 행을 작성했습니다.

dispatcher.BeginInvoke(new InvokeDelegate(ActionOffering));