• vs2010 坑爹的BUG


    以前用VS2005的时候,就遇到过一些很奇怪的BUG,比如始终报错,然后把项目文件删除,重新创建一个项目文件,就好了。

    今天用VS2010测试程序时,又发现一个坑爹的BUG,这绝对不是我的错!

        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                string sguid1 = "ZCL0EF1B122B72B439089178236FD6180BEserver";
                string sguid2 = "zclttrs";
    
                int ISserver = 21;
    
                if (ISserver == 1)
                {
                    if (ISbeginSoft(sguid1)==false)
                        Application.Run(new ZZserver());
                }
                else
                {
                    //问题出在这里,ZZclient执行时,第二个实例会正常启动,而不会弹出提示
                    if (ISbeginSoft(sguid2) == false)
                        //Application.Run(new QQlocalF.ZZclient());
    
    //这4个类,包括我重新创建的 ZZclienty都得到争取执行,启动唯一保护后,都会弹出提示
    //Application.Run(new QQlocal.Form1()); //Application.Run(new QQlocalF.ZZclienty()); //Application.Run(new ZZserver()); //Application.Run(new QQlocal.Ztest()); //不调用ISbeginSoft方法,如下直接写代码,也是可以正确执行的. //var ISbegin = ZCLX.IO.Usual.MemoryRead(sguid2, null); //if (ISbegin.Item1) //{ // MessageBox.Show("软件已经启动"); //} //else //{ // ZCLX.IO.Usual.MemoryWrite(sguid2, 50, "ISbegin"); // Application.Run(new ZZclient()); //} } } public static bool ISbeginSoft(string sx) { var ISbegin = ZCLX.IO.Usual.MemoryRead(sx, null); if (ISbegin.Item1) { MessageBox.Show("软件已经启动"); } else { ZCLX.IO.Usual.MemoryWrite(sx, 50, "ISbegin"); //Application.Run(new ZZclient()); //如果写在这里,那么是可以得到正确执行的. } return ISbegin.Item1; } }
    QQlocalF.ZZclient()是一个Form类,早已经创建,
    ISbeginSoft()是一个静态方法,用于标示一个实例是否启动,它读取一个指定的内存文件名字,如果该文件存在,说明已经有实例建立,那么就弹出提示并正常结束;如果内存文件不存在,那么就写入一个内存文件,并且启动实例。

    以下是内存文件的具体实现:
            public static MemoryMappedFile MemoryWrite(string Filename, int capacity, string Filedata)
            {
                var mmf = MemoryMappedFile.CreateOrOpen(Filename, capacity, MemoryMappedFileAccess.ReadWrite);
    
                using (var stream = mmf.CreateViewStream())  //使用完立即释放内存
                {
                    var writer = new BinaryWriter(stream);
                    writer.Write(Filedata);
                }
    
                return mmf;
            }
    
    
            public static Tuple<bool,string>  MemoryRead(string Filename,string Error)
            {
                try
                {
                    using (var mmf = MemoryMappedFile.OpenExisting(Filename, MemoryMappedFileRights.ReadWrite))
                    {
                        using (var stream = mmf.CreateViewStream())
                        {
                            var reader = new BinaryReader(stream);
                            return new Tuple<bool, string>(true, reader.ReadString());
                        }
                    }
                }
                catch(Exception ex)
                {
                    return new Tuple<bool, string>(false, ex.ToString());
                }
            }

    ZZserver执行正常,
    //问题出在这里,ZZclient执行时,第二个实例会正常启动,而不会弹出提示 if (ISbeginSoft(sguid2) == false) //Application.Run(new QQlocalF.ZZclient());//我怎么都无法找到代码BUG,就这么几行代码,到底哪里出了问题?
    断点调试时:
                if (ISbegin.Item1) //这里的值总是为false,也就是即使创建了一个实例,要么内存文件没有建立,要么无法读取到内存文件.
                {
                    MessageBox.Show("软件已经启动");
                }

    //这4个类,包括我重新创建的 ZZclienty都得到正确执行,启动唯一保护后,都会弹出提示 //Application.Run(new QQlocal.Form1()); //Application.Run(new QQlocalF.ZZclienty()); //Application.Run(new ZZserver()); //Application.Run(new QQlocal.Ztest());

    尝试解决的方法: 重新生成,清理,重新生成,关闭VS重新生成,关闭电脑重新打开.问题依然存在,并且仅仅只是
    ZZclient出错,仅仅只是
    if (ISbeginSoft(sguid2) == false)  //仅仅只是调用这个方法后,如果不调用,那么也可以正确执行
    //Application.Run(new QQlocalF.ZZclient()); //仅仅只是代码写在这里,如果把Application.Run(new QQlocalF.ZZclient());写在ISbeginSoft()方法中,也是可以正确执行
    恰好是ZZclient类,恰好是先调用ISbeginSoft(sguid2) == false方法执行,恰好运行代码写在方法之后,才会出现这个BUG,无法读取内存文件,调试结果为内存文件不存在.
    问题的解决: 我创建一个新的Form类,然后我把ZZclient中的所有控件和方法移植到新的Form控件中,我起名为ZZclienty,
    结果:ZZclienty执行正确!
    我只想说: 这个坑遇到的概率究竟是多少,倒这么大的霉气,日后是不是该撞大运啊!
    分析: 我感觉当创建一个Form类后,VS会为它创建一个唯一值定位,而错误就发生在这个唯一值定位上有问题,所以即使我把它的空间名字更改,把类名字更改,都无法解决,唯有新建一个Form类,才彻底解决问题!
  • 相关阅读:
    JZ067剪绳子
    JZ064滑动窗口的最大值
    JZ061序列化二叉树
    JZ063数据流中的中位数
    JZ066机器人的运动范围
    LeetCode151翻转字符串里的单词
    LeetCode153寻找旋转排序数组中的最小值
    LeetCode162寻找峰值
    JZ062二叉查找树的第 K 个结点
    centos7下rsync+inotify脚本实现文件同步,.NET CORE客户端文件更新后自动重启服务
  • 原文地址:https://www.cnblogs.com/flyant/p/4461893.html
Copyright © 2020-2023  润新知