日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

WMI Series :事件预订和处理

發布時間:2023/11/27 生活经验 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WMI Series :事件预订和处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
WMI事件概述 對于從事Winows編程的開發人員來說,事件驅動的應用程序設計是再熟悉不過了,但是WMI中的事件又是一個什么樣的概念呢?對于寶貴的內存和CPU資源,管理員需要不斷的監視其性能;對于磁盤而言,我們需要隨時知道它的使用情況,包括I/O性能,剩余空間等……操作系統中如此之多的管理對象需要管理員一刻不停的監視其運行的狀態,這樣的工作負擔是十分龐大的。因此,能不能當管理對象的性能數據接近某個我們事先設定的臨界值時,發出警報或者Email通知給管理員,希望他能來處理。這種情形就是WMI中的事件處理機制,這種機制使得開發人員能夠發布、訂閱、傳遞事件的消息。 對于WMI事件處理機制來說,它必須解決三個方面的問題: n????????? 事件發布:能夠找到事件的源; n????????? 事件訂閱:能夠訂閱我感興趣的事件; n????????? 事件傳送:保證事件準確無誤的傳遞到事件訂閱者。 所幸的是WMI架構規范定義了完善的、強大的事件處理框架,使得上面的問題輕松的解決。您可以在編程時給出一個事件查詢,來過濾數據,獲取您感興趣的事件。 WMI事件分為三類: n????????? 內部事件:當類實例被創建、修改、刪除時,WMI響應這些內部的數據變化,這些信息來自CIM儲存庫。 n????????? 外部事件:這類事件是用戶自定義的事件。 n????????? 計時器事件:這種事件是在特定的事件或者每個指定的事件發生的事件,它是由計時器來發布的,并且是訂閱的用戶自己建立的計時器。 ? WMI事件查詢 WMI事件查詢語句與關系數據庫的SQL查詢語句很相似,下面給出一例: SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE TargetInstance isa 'Win32_Service' AND ??? TargetInstance.StartMode = 'Manual' AND ??? TargetInstance.Started = FALSE AND ??? PreviousInstance.Started = TRUE 上面的例子查詢的事件條件(WHERE字句):事件源為Win32_Service(即windows服務)中的服務,服務啟動的模式為手動,而且是剛被停止的服務事件;WITHIN字句指定事件輪詢間隔為10秒鐘;FROM子句指定事件類型,即為實例被修改,包括服務啟動、暫停、終止等。(有關更加詳細的信息請參考WMI SDK文檔) Microsoft公司新發布的Visual Studio 2003增強了服務器資源管理器的功能,對于WMI來說,我們可以通過服務器資源管理器查看管理類和管理事件,并且能夠做事件查詢,簡化了編程前WMI查詢的測試,也可以將這些管理對象做拖放到設計器,簡化了編程。為了使您的服務器資源管理器能夠增建WMI的功能,您需要到Microsoft公司的官方網站下載最新的WMI Extensions for Visual Studio Windows Server 2003 Explorer,并將其安裝。 安裝好了WMI Extensions后,展開服務器資源管理器您就可以看到Management ClassesManagement Events兩個節點。通過WMI Extensions,您可以輕松的完成下列任務: n????????? 查詢WMI類的命名空間。您只需要右鍵單擊Management Classes,選擇Add Classes,在Find class containg文本框輸入類名,然后查找就可以找到這個類所在的命名空間; n????????? 編譯您的WMI查詢語句,從而獲取您感興趣的事件數據。右鍵單擊Management Events,選擇Add Event Query即打開了編譯WMI查詢語句的窗口,在輸入框中輸入查詢語句,并且選擇事件源的類型,就可以執行WMI查詢語句。這里還有一個高級選項,自動生成查詢語句,查詢的結果在Visual Studio的輸出窗口中。 ?? 編程實現事件預定和處理 在這里我們將看到兩個事件預定與處理的例子,一個是關于Win32_Service的事件預定與處理,一個是關于計時器事件的預定與處理,前者是同步的,后者是異步的。在給出例程之前,我們先看看有關事件預定與處理會涉及到的幾個類,它們均位于System.Management命名空間下。 WqlEventQuery類:它代表的是一個WMI事件查詢,它的構造函數有8個,用戶不同的情況。我們將只介紹其中的兩個構造函數。 public WqlEventQuery(string):輸入參數為WMISQL查詢語句,如給出的查詢語句: SELECT * FROM __InstanceModificationEvent WITHIN 10 WHERE TargetInstance isa 'Win32_Service'
public WqlEventQuery(string, TimeSpan, string):輸入參數依次為事件類型,輪詢間隔,過濾條件。對應上面的WMI查詢語句,三個輸入參數分別為:”__InstanceModificationEvent” new TimeSpan(0,0,10)” TargetInstance isa 'Win32_Service'”。上述的兩種方式使用構造函數得到的實例是一樣的。
ManagementEventWatcher類:根據指定的事件查詢預訂臨時事件通知,指定的事件指的是WqlEventQuery類的實例。ManagementEventWatcher的構造函數常使用的是帶一個WqlEventQuery對象的輸入參數。它還有另外一個重要的方法WaitForNextEvent()方法,用于等待下一個與指定查詢匹配的事件,然后返回該事件。Start()方法用于啟動查詢并等待事件通知(發生),Stop()方法停止預定事件通知。
有了這些準備后,我們可以看看程序了。
***************************************************** //同步的事件預定和處理 public static void syncEvent() ???? { ???? //創建事件查詢,每隔一秒輪詢一次 ???? string Query="SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance isa 'Win32_Service' AND TargetInstance.StartMode = 'Manual' AND TargetInstance.Started = FALSE AND PreviousInstance.Started = TRUE"; ???? WqlEventQuery query=new WqlEventQuery(Query);????? ???? ManagementEventWatcher watcher=new ManagementEventWatcher(query); ???? // 直到下一次事件發生 ???? ManagementBaseObject e = watcher.WaitForNextEvent(); ???? //顯示返回事件的信息 ???? Console.WriteLine( ?????????????????? "服務{0}剛被停止, 現在的狀態為: {1},服務描述為: {2}", ?????????????????? ((ManagementBaseObject)e["TargetInstance"])["Name"],????????????????? ???????? ???? ((ManagementBaseObject)e["TargetInstance"])["State"],((ManagementBaseObject)e["TargetInstance"])["Description"]); ???? //退出事件預定 ???? watcher.Stop();??????? ???????? } *****************************************************
應該說來上面的程序是比較簡單的,為了測試結果,您可以將你的服務管理器中的任何一個手動啟動的服務(或將其中一個服務改為手動啟動)從啟動狀態改為停止,上面的程序就會有輸出結果了。如果您選定的服務不是手動啟動的,后者服務不是從啟動狀態改為停止,上面的事件查詢將不會有任何結果,一直等待一個符合WQL查詢條件的事件發生。
下面要講的一個例子是計時器對象的事件預定和處理,有關計時器的知識,您可以閱讀本書的計數器技術章節獲取更為詳細的信息。這個程序依照下列步驟:
1)??????? 創建計時器事件的管理類對象;
2)??????? 獲取計時器的實例;
3)??????? 設定計時器的參數;
4)??????? 計時器開始定時;
5)??????? 創建計時器事件查詢的WqlEventQuery類型實例,并預定事件;
6)??????? 掛接計時器事件處理方法;
7)??????? 開始偵聽計時器事件;
8)??????? 停止預定計時器事件。
首先我們定義計時器事件的處理方法:
***************************************************** //定義事件處理方法 public class EventHandler { ???? public void HandleEvent(object sender, EventArrivedEventArgs e)?? ???????? { ???????? ???? Console.WriteLine("Event arrived !"); ???????? } ???? } *****************************************************
接下來的代碼為計時器事件預定與處理的全部代碼:
?
?
?
***************************************************** //計時器事件預定與處理 public static void asyncEvent() ???? { ???????? ManagementClass timerClass = ???????? new ManagementClass("__IntervalTimerInstruction"); ???? ???? ManagementObject timer = timerClass.CreateInstance(); ???????? timer["TimerId"] = "Timer1"; ???????? timer["IntervalBetweenEvents"] = 1000; ???????? timer.Put(); ???????? // 預定計時器事件 ???????? // 創建計時器事件查詢 ???????? WqlEventQuery query = ?????????????????? new WqlEventQuery("__TimerEvent", "TimerId=/"Timer1/""); ???????? // 初始化watcher,并預定query定義的事件 ???????? ManagementEventWatcher watcher = new ManagementEventWatcher(query); ???????? // 掛接事件的處理方法 ???????? watcher.EventArrived += ?????????????????? new EventArrivedEventHandler((new EventHandler()).HandleEvent); ???????? // 開始偵停事件 ???????? watcher.Start(); ???????? // 暫停線程執行,以使watcher偵聽事件 ???????? System.Threading.Thread.Sleep(10000); ???????? // 停止事件預定 ???????? watcher.Stop(); ???? } *****************************************************
正如我在前面所講述的,計時器的實例是由訂閱者自己定義的。
?

總結

以上是生活随笔為你收集整理的WMI Series :事件预订和处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。