經過一個多月,終于釋出了秋式廣告殺手新版本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來判斷是否同一程序。

好了,本節,基本就分享這兩個相對被我記住的知識小點。
軟體更新:軟體重新開機運作,系統會自動更新。
版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:
http://www.cnblogs.com/cyq1162/archive/2013/03/10/2952934.html