2012-01-05 111 views
2

在Winform應用程序中,我創建了一些環境變量(Windows 7)。創作有效,但速度很慢,約9秒創建一個。通過Winform應用程序創建環境變量,非常慢

我用這個代碼:

Environment.SetEnvironmentVariable(
    variableName, 
    value, 
    EnvironmentVariableTarget.Machine 
); 

是很奇怪,不是嗎?

查看日誌:

5/01/2012 08:22:09 : MyVar1 
5/01/2012 08:22:18 : MyVar2 
5/01/2012 08:22:26 : MyVar3 
+0

你真的需要他們或你不能讓他們在*應用程序設置* – V4Vendetta 2012-01-05 07:45:10

+1

@ V4Vendetta是需要他們。應用程序是一種用於爲主應用程序設置環境(並將這些變量設置爲作業的一部分)的安裝程序。 – 2012-01-05 07:48:12

+0

'[variableName]'和'[value]'的值是什麼?你在日誌之間做了什麼嗎?一些代碼會有幫助。 – 2013-05-23 05:44:39

回答

1

檢查你所運行,多個正在運行的進程意味着你可以有一個較長時間的延遲,關閉正在運行的所有應用程序(瀏覽器,IE瀏覽器,記事本等)並運行該應用程序以查看需要多長時間。

for (int i = 0; i < 5; i++) 
{ 
    stopwatch.Restart(); 
    Environment.SetEnvironmentVariable(
     "Variable " + i, 
     i.ToString(), 
     EnvironmentVariableTarget.Machine); 
    Console.WriteLine(stopwatch.ElapsedMilliseconds + " Variable:" + i); 
} 

這一段代碼(與我的機器上的所有應用閉合)執行的每個SetEnvironmentVariable呼叫< 300毫秒。另外,考慮使用EnvironmentVariableTarget.Process,因爲它會比設置整個機器的變量更快。

根據Environment類的來源(可以找到here,第864行),設置好用戶/機器範圍環境變量後,調用本地SendMessageTimeout函數來通知任何進程有關環境的變化。下面是摘錄:

IntPtr r = Win32Native.SendMessageTimeout(
    new IntPtr(Win32Native.HWND_BROADCAST), 
    Win32Native.WM_SETTINGCHANGE, 
    IntPtr.Zero, 
    "Environment", 
    0, 
    1000, 
    IntPtr.Zero); 

所以1000毫秒(1秒)超時被提供給任何接收方處理該消息。例如。如果其中5個未能處理它,則可能會有5秒的延遲。有關SendMessageTimeout的更多信息,請參閱MSDN

- 感謝Dmitry

+0

我有同樣的問題,並訴諸使用外部程序來設置env變量(在後臺)。這是一個黑客,但至少我的程序沒有減速(在VBA中,你不能真正在後臺線程中運行):http://www.codeguru.com/cpp/wp/win32/tutorials/article.php /c10849/Setting-a-System-Environment-Variable.htm – RaB 2013-10-27 09:29:18

相關問題