各位程序员大家好
我正在编写一个管理 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);
}
}
正如FelixCastor所建议的那样,我检查了正在运行我正在调用的函数的线程,并且没有在同一线程上运行。我在代码中所做的更改非常小。
我在代码部分中声明了我知道将由主线程执行的调度程序。
public static Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
我这样做是因为,根据 dοcumentation,调度程序将在声明的线程上"运行"。因此,如果我想在主线程上运行该函数,我必须在那里声明它。然后,我编写了这行简单的代码,强制ActionOfferive函数在调度程序(主(线程上运行。
dispatcher.BeginInvoke(new InvokeDelegate(ActionOffering));