C# C窗体在创建后被阻止

C# C窗体在创建后被阻止,c#,winforms,C#,Winforms,当某个事件发生时,我正在创建一个表单。我将创建的表单放入创建它的类的静态成员中。我调试了代码,一切正常,但表单仍然被阻止,用户无法在此窗口中执行任何操作。它只是在加载动画时出现,请参见图片。因此,打开的窗口中没有可单击的内容,您甚至无法关闭它 class CallManagementObserver : CallObserver { private static FrmIncomingCall frmCurrentCall; public CallManagementObse

当某个事件发生时,我正在创建一个表单。我将创建的表单放入创建它的类的静态成员中。我调试了代码,一切正常,但表单仍然被阻止,用户无法在此窗口中执行任何操作。它只是在加载动画时出现,请参见图片。因此,打开的窗口中没有可单击的内容,您甚至无法关闭它

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;
                }
            }
        }
    }
}
如上所示,我编写了自己的表单类,其代码如下:

公共部分类FrmIncomingCall:表单 { 呼叫收入呼叫; 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显示表单时,它是可用的,但是程序停止了,因为我想这就是对话框的用途


你知道我做错了什么吗?没有冻结,程序运行正常。

好吧,你的应用程序设计得很糟糕……你似乎不知道什么是多线程,为什么要使用它

如果应用程序永远挂起,那么要么出现死锁,比如调用系统上的对话框等待,要么调用系统上的对话框等待

因为我不知道CallEv是什么,也不知道它的用途

好的,如果调用系统工作并且UI从未更新,那么很明显,您从未让UI有时间更新,因为您的UI线程100%的时间都在使用调用系统或等待它

这意味着调用系统可能应该从另一个线程使用,并且两个线程之间应该有一些通信

调用系统也可能以多种不同的方式使用,因为在串行端口和TCP通信中,可以使用最适合其应用程序的方式

代码的另一个问题是,当您关闭对话框时,据我所知,如果不重新创建对话框,它将无法再使用,因为对话框将被释放…因此您需要将formCurrentCall设置为null并更新任何受影响的代码。或者,您可以隐藏该表单,并在需要时再次显示它


在任何情况下,都很难为您提供帮助,因为我们不知道您的代码中调用了什么以及其他类或事件。此外,我们也不知道UI没有响应或更新时正在执行哪些代码。因此,问题是没有足够的信息。事实上,使用调试器调试此类问题要容易得多,因为它要容易得多查看哪些代码正在运行,哪些代码行需要时间来执行,甚至查看哪些代码没有执行。

使用调试器,应该很容易确定冻结的位置……事实上,在使用Visual Studio进行调试时,您可以使用调试菜单Ctrl+Alt+Break中的命令Break all,它通常会准确显示问题所在。有时,您可能需要选择适当的线程。问题是没有任何东西冻结,程序正在正确运行。如果您单击表单,Windows是否显示类似此应用程序没有响应的内容?这显然表明UI线程在100%的时间内都很忙,并且在大多数情况下表明应用程序应该重新设计ned要求正确使用后台线程,以便UI始终具有响应性。你自相矛盾。你说你在windows中什么也做不了,所以很明显windows是冻结的,你说什么也不冻结。这很难解释,首先:感谢你的时间。CallEv来自JTAPI,你可能听说过它-Java电话API。我用IKVM将jtapi.jar库翻译成了一个.dll,因为这里没有其他方法可以使用C语言的电话系统。