C#表单在创建后被阻止

时间:2016-12-01 14:27:22

标签: c# winforms

我在某个事件发生时创建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时,它可以使用,但程序停止(因为这是我猜的对话框。)

任何想法我做错了什么?什么都没有冻结,程序运行正常。

1 个答案:

答案 0 :(得分:0)

嗯,你的应用程序设计很糟糕......似乎你不知道多线程是什么以及为什么要使用它。

如果应用程序永远挂起,那么就会出现死锁(类似于调用系统上的对话框等待以及调用系统在对话框上等待)。

我不知道CallEv是什么以及如何使用它。

好吧,如果调用系统工作且UI永远不会更新,那么显然,你永远不会让UI有时间更新,因为你的UI线程是100%的时间使用调用系统或等待它。 / p>

这意味着调用系统应该可以从另一个线程使用,并且你应该在两个线程之间进行一些通信......

调用系统也可能以多种不同的方式使用(就像串行端口和TCP通信一样),人们可以使用最适合他应用的方式。

你的代码的另一个问题是,当你关闭一个对话框时,据我所知它不能再使用而不再重新设置对话框,因为对话框会被处理......所以你需要设置{{1} } formCurrentCall并更新任何受影响的代码。或者,您可以隐藏表单,并在需要时再次显示。

在任何情况下,很难帮助您,因为我们不知道代码中的null和其他类或事件是什么。此外,当UI未响应(或更新)时,我们不知道正在执行哪些代码。所以这个问题没有足够的信息。事实上,这样的问题使用调试器更容易调试,因为它更容易看到运行什么代码以及哪行代码需要时间来执行,甚至看看哪些代码没有被执行。