2017-05-12 3 views
-5

Hallo Kollegen ProgrammiererEreignisse korrumpiert das Ergebnis der Funktion

Ich schreibe ein Programm nach C#, die TAPI-Bibliothek verwaltet. Ich werde den Code nicht geben (es sei denn jemand bittet ihn), weil er Befehle für eine Software namens Softone hat und geschäftsbezogen ist. Das Problem, das ich habe, ist das folgende:

Ich möchte zum Beispiel, wenn ein Anruf kommt, um eine Funktion auszuführen. Ganz einfach. Also setze ich den Event-Hanlder und rufe die Funktion auf, aber während es läuft, ist das Ergebnis, das es dem Programm gibt, das ich erwähnt habe (Softone) falsch. Die gleiche Funktion, ob manuell oder auf andere Weise ausgeführt, liefert korrekte Ergebnisse. Ich habe versucht, den Event-Handler zu deaktivieren, die Funktion auszuführen und den Event-Handler erneut zu aktivieren. Aber das ist auch ein Fehler.

Was ich möchte ist eine andere Möglichkeit zu verhindern, dass Ereignisse die Daten der Funktion verfälschen. Haben Sie etwas zu empfehlen?

Ich bin ein Anfänger also bitte Verständnis zeigen. Thanks :)

 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

Wird Ereignis von einem anderen Thread ausgelöst? In diesem Fall müssen Sie möglicherweise zum Hauptthread zurückkehren. –

+3

Es wäre am besten, dort einen zensierten Code einzubauen, damit wir sehen können, was vor sich geht. –

+0

Vielen Dank für die schnelle Antwort. Ich werde den Code in einer Minute veröffentlichen. Und ich werde auch den Thread-Vorschlag überprüfen –

Antwort

0

Als FelixCastor vorgeschlagen, überprüfte ich den Thread, in dem die Funktion Ich rufe läuft und nicht auf dem gleichen Thread ausgeführt werden. Die Änderung, die ich im Code vorgenommen habe, war sehr klein.

Ich habe den Dispatcher im Codeabschnitt deklariert, von dem ich weiß, dass er vom Hauptthread ausgeführt wird.

public static Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

Ich tat dies, weil nach dem dοcumentation der Dispatcher „run“ auf dem Thread, der erklärt wird. Also wenn ich die Funktion auf dem Hauptthread ausführen wollte, musste ich es dort deklarieren. Dann schrieb ich diese einfache Codezeile, die erzwingt, dass die ActionOffering-Funktion auf dem Dispatcher (Haupt) -Thread ausgeführt wird.

dispatcher.BeginInvoke(new InvokeDelegate(ActionOffering)); 
Verwandte Themen