2012-05-08 52 views
9

我在寫一個應用程序,它有一個在Windows啓動時運行的選項。C# - 如何知道啓動後Windows何時「安定」?

在應用程序崩潰之前,我無法忍受應用程序崩潰之前,這是一個非關鍵應用程序。我希望我的應用程序能夠禮貌地等待所有其他啓動項目完成並解決,以便用戶的PC在開始進行任何工作之前變得響應。

我該如何去檢測這種情況?我想我可以遍歷註冊表並查找所有正在運行的啓動進程,或使用較長的計時器。我只是希望還有另一個可能會使用的黑客技巧。

編輯:應用程序有一個用戶界面,不能作爲服務運行。它有一個托盤模式。它做了一些圖像渲染。

+1

[本文](http://blogs.msdn.com/b/oldnewthing/archive/2005/03/11/394249.aspx)可能對您有些興趣 – Vlad

+2

沒有具體的信號。我想你可以對CPU負載和磁盤傳輸的性能計數器進行採樣。 –

+0

好吧,我不得不添加下面的評論:我永遠不會創建一個默認啓動時運行的應用程序。你必須明確地設置它。如果你在你的申請中這樣做,並且沒有一些商人說他們會解僱你,如果你不這樣做,你是一個壞人! –

回答

4

「長」定時器是最好的路線。我不會用注射器觸摸註冊表。

你會想要考慮的一件事是,如果用戶想要自己啓動你的程序會發生什麼?顯然,你不希望造成延遲。

我假設你的應用程序有一個UI?如果沒有,你可以考慮服務與Vista中設置其啓動類型爲「自動(延遲)」/7

也請參閱此相關的問題:How to create delay startup application in c#?

最後一點,如果你的程序是不可關鍵的,你擔心它可能會減慢速度,考慮降低應用程序的優先級。

+1

接受答案的徹底性,我想我會結束等待CPU使用率來解決,然後使用最低優先級的線程,並允許優先級可配置,我也可以欣賞你對註冊表的評論。是最後的手段:<) –

2

看來這是最好留在用戶手中的事情類型,Windows已經提供了一個很好的選擇來控制這種情況,至少對於Windows服務來說。

如果這是一個Windows服務,該服務可以被配置爲啓動自動(延遲啓動)

也許這是最好的選擇?

如果你不想走那條路線,或者如果你的程序不是Windows服務,檢測Windows何時「安定」是相當主觀和容易出錯的。您可以將Disk IO作爲一個可靠的指標進行監控。磁盤IO通常是啓動時的瓶頸(特別是對於沒有SSD操作系統驅動器的系統)。您可能會收到一個合理的等待磁盤IO(如性能計數器所示)降至某個閾值以下的「穩定性」的近似值。您希望等待的時間不會超過可配置的時間量,然後以任何方式啓動,因爲某些系統可能會啓動並開始執行不相關的長期運行任務,從而對IO子系統徵稅。

+0

這也是一個很好的方法。我使用Disk IO輪詢,CPU使用率輪詢和等待的最長時間的組合來實現清爽。 –

1

兩個建議:

  1. 使用低優先級的線程做你的工作。畢竟,這是一個低優先級,對吧?僅此一項就有可能成功最小化啓動影響。
  2. 如果你真的想等待事情解決 - 只需檢查處理器的內存利用率,而不是做所有的註冊表讀取或等待任意時間。說明如下:How to get the CPU Usage in C#?

祝你好運!

1

相當晚(到四年)到這裏的派對,但如果其他人絆倒在這Q &像我一樣......我問了一個similar question,但我的重點是知道什麼時候事情在用戶日誌之前安定下來-在。我瞭解OP的應用程序是從桌面運行的,並具有UI元素等。但是,如果您檢查該線程,則會看到有方法可以判斷Windows是否已完成加載服務。因此,服務可以在啓動時運行,清除「完成」標誌,等待服務啓動,然後設置該標誌。現在,當用戶登錄時,如果系統仍在運行,應用程序將知道並且不急於初始化用戶界面。如果設置了「完成」標誌,那麼用戶界面可以「開始感覺舒服」,因爲大多數或所有其他應用程序都已經完成了他們的工作。用戶登錄後可能會啓動另一個應用程序。因此,完成標誌將被設置,但事情仍可能繼續。這是其他建議的CPU使用檢查有價值的地方。

相關問題