Form.ShowDialog制动锁定机制

时间:2015-09-17 08:13:03

标签: c# winforms locking showdialog

我正在为我们的文档管理项目开发NSE。我差不多完成了它,但我遇到了问题,但我还是找不到解决方案。

首先,我将解释我的情景。我的项目中有两个应用程序,一个是命名空间扩展,另一个是托盘工作,它是一个简单的gui,用于通知,历史记录和分机。

两个应用程序都需要连接,我使用静态类和静态变量,但这两个应用程序使用不同的AppDomain,所以我有两个相同静态类的实例。这不是问题,因为我在它们之间建立了沟通并且它正常工作。

问题是;当我的两个应用程序运行,如果我从gui应用程序注销,NSE也运行注销方法。考虑NSE文件夹已打开,该文件夹中有项目,从gui app注销。之后,如果你回去NSEFolder windows想要刷新项目,原因我需要一个成功连接的连接。如果没有连接,它将打开登录屏幕。 Windows正在为所有项目进行异步调用。我想只打开一次登录屏幕。所以我使用了锁机制但是当代码来自form.ShowDialog()方法第一次时,锁机制让我们通过第二次调用。 Lock完美无缺,直到代码出现showdiolog方法。它只发生在第一次通话显示屏幕后,锁定只通过第二次通话。在第一次锁定操作完成之前,锁定不会通过第三次调用。所以它有效,但不是我想要的正确。

当第二个调用通过锁定并显示对话框时,首先显示对话框,我的程序会等待它。但登录后,它看起来没有任何变化,并保持所有呼叫的打开登录表单。你知道我应该使用什么,或者我的错误是什么?

我的代码就是这样;

private static object syncLock = new object();

    private static Connection _con;
    public static Connection Connection
    {
        get
        {
            if (_con == null && TryConnect)
            {
                lock (syncLock)
                {
                    if (_con == null && TryConnect)
                    {
                        LoginForm form = new LoginForm();
                        form.BringToFront();
                        form.TopMost = true;
                        if (form.CheckAutoLogin() || form.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            _con = form.Connection;
                            string message = string.Format("Login#{0}#{1}#{2}", _con.Server, _con.UserID, Globals.Password);
                            DriveBACommon.Classes.PipeHelper.Instance.Send(message);
                            TryConnect = true;
                        }
                        else
                        {
                            TryConnect = false;
                        }
                    }

                    if (_con != null && !_con.Connected)
                    {
                        _con.Open();
                    }
                    return _con;
                }
            }
            return _con;
        }
        internal set
        {
            _con = value;
        }
    }

0 个答案:

没有答案