我在某个事件发生时创建Form
。我将创建的Form
放入创建它的类的静态成员中。我调试了代码,一切正常,但Form保持阻塞状态,用户无法在此窗口中执行任何操作。它只是出现加载动画(见图)。因此,打开的窗口中没有任何内容可以点击,你甚至无法关闭它。
class CallManagementObserver : CallObserver
{
private static FrmIncomingCall frmCurrentCall;
public CallManagementObserver()
{
}
public void callChangedEvent(CallEv[] events)
{
foreach (CallEv currentEvent in events)
{
switch (currentEvent.getID())
{
case TermConnRingingEv.ID:
// Incoming call
frmCurrentCall = new FrmIncomingCall(currentEvent);
frmCurrentCall.Show();
frmCurrentCall.Update();
break;
case CiscoCallInfoChangedEv.ID:
// User accepted external call on terminal
frmCurrentCall.Close();
break;
case TermConnActiveEv.ID:
// User is in call
frmCurrentCall.Close();
break;
case ConnDisconnectedEv.ID:
// Caller has hung up
frmCurrentCall.Close();
break;
default:
break;
}
}
}
}
}
如上所示,我编写了自己的Form类,其代码位于:
公共部分类FrmIncomingCall:表单 { 调用incomingCall; CallEv currentEvent;
public FrmIncomingCall(CallEv currentEvent)
{
InitializeComponent();
this.currentEvent = currentEvent;
this.incomingCall = currentEvent.getCall();
}
private void initGui()
{
Connection[] callConnections = incomingCall.getConnections();
Address caller = callConnections[1].getAddress();
lblIncomingCallSource.Text = caller.getName();
}
private void btnAcceptCall_Click(object sender, System.EventArgs e)
{
TermConnEv termConnEv = (TermConnEv)currentEvent;
TerminalConnection termConn = termConnEv.getTerminalConnection();
termConn.answer();
}
private void frmIncomingCall_Load(object sender, System.EventArgs e)
{
initGui();
}
}
当我通过ShowDialog()显示Form时,它可以使用,但程序停止(因为这是我猜的对话框。)
任何想法我做错了什么?什么都没有冻结,程序运行正常。
答案 0 :(得分:0)
嗯,你的应用程序设计很糟糕......似乎你不知道多线程是什么以及为什么要使用它。
如果应用程序永远挂起,那么就会出现死锁(类似于调用系统上的对话框等待以及调用系统在对话框上等待)。
我不知道CallEv
是什么以及如何使用它。
好吧,如果调用系统工作且UI永远不会更新,那么显然,你永远不会让UI有时间更新,因为你的UI线程是100%的时间使用调用系统或等待它。 / p>
这意味着调用系统应该可以从另一个线程使用,并且你应该在两个线程之间进行一些通信......
调用系统也可能以多种不同的方式使用(就像串行端口和TCP通信一样),人们可以使用最适合他应用的方式。
你的代码的另一个问题是,当你关闭一个对话框时,据我所知它不能再使用而不再重新设置对话框,因为对话框会被处理......所以你需要设置{{1} } formCurrentCall
并更新任何受影响的代码。或者,您可以隐藏表单,并在需要时再次显示。
在任何情况下,很难帮助您,因为我们不知道代码中的null
和其他类或事件是什么。此外,当UI未响应(或更新)时,我们不知道正在执行哪些代码。所以这个问题没有足够的信息。事实上,这样的问题使用调试器更容易调试,因为它更容易看到运行什么代码以及哪行代码需要时间来执行,甚至看看哪些代码没有被执行。