事件会破坏函数的结果

时间:2017-05-12 13:18:39

标签: c# events tapi

Hello其他程序员

我正在向管理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);
        }
    }

1 个答案:

答案 0 :(得分:0)

正如FelixCastor建议的那样,我检查了我正在调用的函数正在运行的线程,并且没有在同一个线程上运行。我在代码中所做的更改非常小。

我在代码部分声明了调度程序,我知道它将由主线程执行。

$ awk '
{
    if($5 in f)                              # if first exists
        l[$5]=$0                             # update last
    else f[$5]=$0 }                          # else first
END {
    for(i in f)                              # loop all firsts
        print f[i] ((i in l)?ORS l[i]:"") }  # output firsts and lasts if exist
' file
15 May 2017 03:43:40 696
15 May 2017 03:45:02 696
15 May 2017 23:30:22 9502
15 May 2017 23:52:42 9502
15 May 2017 02:18:32 12795    
15 May 2017 02:20:02 12795
15 May 2017 02:33:39 13674
15 May 2017 02:35:42 13674
15 May 2017 18:52:28 19143
15 May 2017 18:54:40 19143

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

 public static Dispatcher dispatcher = Dispatcher.CurrentDispatcher;