经过一个多月,终于发布了秋式广告杀手新版本V2.5了,由于基本上问题很少,所以更新周期就长一些。
这里谈一点这次改动涉及到的内容和知识点:
1: 去掉了最初依赖的Hosts模式,所以对Hosts的增删改代码都去除了。
2: 百度竞价广告的屏蔽,除了原有的百度搜索,增加百度知识页面的广告屏蔽。
3: 增加了一台服务器,提供默认一剑出墙的服务。
4: 针对默认代理功能,经过层层思考,允许软件在不同目录下的时候可以开多个,以监听不同的端口,变成一款多端口代理软件。
下面分享几个升级中,被我记住的知识点:
1:线程的try catch的必要性:
先说下线程异常的危害性:
1:winform程序:线程异常,若未try,会导致软件自动退出。
2:webform程序:线程异常,若未try,会导致应用程序池重启,类似网站重启。
总结:
别太过份相信自己对代码的掌控,只要是线程的代码函数,都加个try保险,我这种层次的都逃不过万一的某种错误,对于软件,真是稳定压倒一切。
2: 软件只能启动单个实例的知识点:
有时候,我们只允许软件启动一个实例,所以我们通常会有这么段通用代码检测:
static class Program{ public static System.Threading.Semaphore _mutex; /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { _mutex = new System.Threading.Semaphore(1, 1, "adkiller"); if (_mutex.WaitOne(0, false) == false) { MessageBox.Show("软件已经启动过了!", "运行提示"); return;
}
}
}
需要有点变化:这次的升级, 需要变成了在不同的目录允许多开,所以,按逻辑,我写下了这么段代码:
Process cp = Process.GetCurrentProcess(); Process[] allPros = Process.GetProcessesByName(cp.ProcessName); processCount = allPros.Length; if (processCount > 1) { foreach (Process pro in allPros) { if (cp != pro && cp.MainModule.FileName == pro.MainModule.FileName) { MessageBox.Show("软件已经启动过了!", "运行提示"); return; } }
}
这里又涉及到两个知识点:
1:调试期的问题:
在调试的时候,默认有个.vshost宿主,导致调试后运行的软件名称为:秋式广告杀手.vshost.exe
我要测试多个不同目录的软件运行,所以在其它目录也运行了软件,问题来了:
调试的进程“秋式广告杀手.vshost.exe”和直接运行的“秋式广告杀手.exe”,是对不上号的。
解决方法:
这时候,只要把:项目-右键属性-调试-启用VS宿主进程的勾去掉就可以了。
2:想当然的错误:
以为Process.GetCurrentProcess()获取出来的当前进程对象,总会和获取进程列表里的同个进程对象一样,所以才有了cp==pro这样的对象比较判断。
实际的错误:
用Process.GetCurrentProcess出来的对象,和循环进程的每一个pro对象都是不等的,所以直接的判断是错误。
网上这样相当然的错误代码有点多:
一开始,我也网上搜了搜,发现好多和我写的相当然的代码一样,网上也有这种用=号判断出错误示例代码,大伙要注意下。
解决方法:
经过本人细心的发现,对于进程,其进程ID是一样的,于是把判断的语句改成:
cp.Id!=pro.Id
通过进程ID来判断是否同一进程。
好了,本节,基本就分享这两个相对被我记住的知识小点。
软件升级:软件重启运行,系统会自动升级。