我正在尝试使用JulMar的Atapi x86构建基于TAPI的电话系统。其中一个功能是在入站呼叫中弹出特定表单。然而,每当表单弹出时,它都会出现错误,如下所示(我已经尝试了几种形式作为测试,它们都做同样的事情)。没有错误,输出窗口中没有任何内容可以表明问题所在。
代码:
private void incomingcall(object sender, NewCallEventArgs e)
{
string phonenumber = e.Call.CallerId; //get the phone number of the call
SqlCommand getincoming = new SqlCommand(Querystrings.getincomingquery(), DB);
getincoming.Parameters.AddWithValue("@@TELEPHONE", phonenumber);
DataTable results = new DataTable();
try
{
DB.Open();
using (var results = getincoming.ExecuteReader())
{
results.Load(results);
}
}
catch (Exception ex)
{
Inbound ib = new Inbound(phonenumber, null);
ib.Show();
}
finally
{
DB.Close();
}
if (results.Rows.Count == 1)
{
loadcontactrequest(Convert.ToInt32(results.Rows[0].ItemArray[0]), phonenumber);
}
else
{
loadinbound(phonenumber, results);
}
}
我已经在这个函数之外的其他点加载了这些表单,这意味着它与这个函数有关。有人知道我哪里出错吗?
编辑:
private void loadcontactrequest(int ContactID, string phonenumber)
{
ContactRequest cr = new ContactRequest(ContactID, Global.loginbound("Single customer found", phonenumber));
cr.Show();
}
这些功能已经在其他地方测试过并且单独运行,我相信它可能与TAPI有关。
编辑2 - 代表:
public static void inittapi()
{
if (TestOptions.notapi)
return;
tapi = new TapiManager("Omitted");
tapi.Initialize();
foreach (TapiLine ad in tapi.Lines) //Get all lines available to this PC
{
if (ad.Name.ToUpper().Contains("Omitted"))
{
phoneline = ad;
phoneline.Open(MediaModes.All); //Open the phone line for making and receiving calls
phoneline.NewCall += new EventHandler<NewCallEventArgs>(new TAPI().incomingcall); //Add the incoming call event handler
}
}
}
答案 0 :(得分:1)
此事件可能在与应用程序的UI线程不同的线程上触发。
修改这样的方法以测试这是否是问题:
private void incomingcall(object sender, NewCallEventArgs e)
{
Form form;
if(Application.OpenForms.Count > 0)
{
form = Application.OpenForms[0];
}
if (form != null && form.InvokeRequired)
{
form.BeginInvoke(new Action(() => { incomingcall(sender, e); }));
return;
}
// Your current code goes here
}
这将标识我们所处的线程与您创建的主窗体(窗体)不同,然后在主窗体的线程上再次执行该函数。