2017-05-12 12 views
-5

こんにちは仲間のプログラマイベントは関数の結果を壊します

私はTAPIライブラリを管理するC#にプログラムを書いています。私は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

お返事ありがとうございました。コードを1分で投稿します。また、私はスレッドの提案をチェックします –

答えて

0

FelixCastorが示唆したように、私は私が呼んでいる関数が実行されているスレッドをチェックし、同じスレッド上で実行されませんでした。コードで行った変更は非常に小さかった。

私が知っているコードセクションのディスパッチャはメインスレッドによって実行されると宣言しました。

public static Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

dοcumentationによると、ディスパッチャが宣言されたスレッド上で、「実行」されます、ので、私はこれをしました。だから、私がメインスレッド上で関数を実行したければ、そこに宣言しなければなりませんでした。次に、この単純なコード行を書いて、ActionOffering関数をディスパッチャー(メイン)スレッド上で実行するようにしました。

dispatcher.BeginInvoke(new InvokeDelegate(ActionOffering));