講述關(guān)于VB.NET事件處理程序
VB.NET經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶都很了解它了,這里我就VB.NET事件處理程序發(fā)表一下個(gè)人理解,和大家討論討論。
文件系統(tǒng)監(jiān)控
我曾經(jīng)遇到過(guò)一些應(yīng)用程序,需要等待和處理某個(gè)特定目錄中的文件-例如,將數(shù)據(jù)從文件導(dǎo)入到數(shù)據(jù)庫(kù)中去的應(yīng)用程序。數(shù)據(jù)文件可以從某個(gè)大型機(jī)上下載,或者被轉(zhuǎn)移到某個(gè)輸入目錄中,該應(yīng)用程序?qū)⑺鼈儗?dǎo)入到數(shù)據(jù)庫(kù)中。你不用經(jīng)常地輪詢?cè)撃夸洐z查是否有新文件,可以等待生成新文件的通知。你可以在Visual Basic 6.0中使用Win32 API來(lái)做到這一點(diǎn),而在Visual Basic .NET中你可以使用.NET Framework類來(lái)做這項(xiàng)工作。但是在.NET中實(shí)施文件監(jiān)控與在.NET中完成其他工作的方法更加一致,因此學(xué)習(xí)曲線是最小的。
你可以使用System.IO.FileSystemWatcher .NET類對(duì)文件系統(tǒng)進(jìn)行監(jiān)視。它提供了一些屬性,允許你設(shè)置監(jiān)控的路徑,指定是對(duì)文件還是子目錄層次的變化感興趣。System.IO.FileSystemWatcher還允許你指定需要監(jiān)控的文件名和文件類型(例如,*.xml是指監(jiān)控所有XML文件的變化)。最后,你可以指定感興趣的變化類型-例如,只對(duì)新建文件,文件屬性的變化或文件大小的變化感興趣。
在你設(shè)置了監(jiān)控內(nèi)容后,你需要鉤住用于感興趣的各種事件的VB.NET事件處理程序。FileSystemWatcher事件有Changed、Created、Deleted、Error和Renamed。要處理某個(gè)事件,首先你需要編寫一個(gè)與FileSystemEventHandler代理相同聲明的VB.NET事件處理程序,然后將這個(gè)處理程序添加到FileSystemWatcher類中。這個(gè)基于代理的體系結(jié)構(gòu)允許你為同一個(gè)事件添加多個(gè)處理程序,或者對(duì)于多個(gè)事件使用同一個(gè)處理程序-而你不能使用Visual Basic 6.0做到這一點(diǎn)。
- 注釋:System.IO contains the
- 注釋:file monitoring classes and types
- Imports System.IO
- Module
- Module1
- Sub Main()
- 注釋:FileSystemWatcher does the real work
- Dim fw As New FileSystemWatcher()
- 注釋:WaitForChangedResult is what you
- 注釋:get back when a change occurs
- Dim result As WaitForChangedResult
- 注釋:set the path to monitor
- fw.Path = "C:WINNT"
- 注釋:tell it whether to watch files or directories
- fw.Target = WatcherTarget.File
- 注釋:tell it whether to include subdirs
- fw.IncludeSubdirectories = False
- 注釋:hook up handlers AddHandler fw.Created,New FileSystemEventHandler(AddressOf OnFileNotify)注釋:enable the watcher
- fw.Enabled = True DoConsole.WriteLine("Beginning to monitor")
- 注釋:this is where we actually wait
- 注釋:waiting blocks execution for the specified timeoutresult = fw.WaitForChanged(WatcherChangeTypes.All, 60000)Console.WriteLine("Hit Enter to continue q to quit")
- Loop While (Console.ReadLine <> "q")End Sub
- 注釋:This is the delegate that gets
- 注釋:called when a file is created
- Public Sub OnFileNotify(ByVal source As Object, ByVal e As FileSystemEventArgs)Console.WriteLine( "Notification received for file , change type is ", _e.FullPath, e.ChangeType) End SubEnd Module
你可以創(chuàng)建一個(gè)FileSystemWatcher,然后設(shè)置它的屬性。你可以使用AddHandler將FileSystemEventHandler代理與各種FileSystemWatcher事件關(guān)聯(lián)起來(lái),如Created。然后你就可以啟用FileSystemWatcher,然后調(diào)用WaitForChanged。該調(diào)用將在變化發(fā)生或達(dá)到指定的超時(shí)時(shí)返回。
創(chuàng)建Windows服務(wù)
當(dāng)你要?jiǎng)?chuàng)建一個(gè)Windows服務(wù)時(shí),你必須使用Visual C++或在Visual Basic中使用srvany.exe或第三方工具來(lái)創(chuàng)建該服務(wù)。任何一種方法,你都沒(méi)有在Visual Basic中編寫自己的服務(wù),你只是正在Visual Basic運(yùn)行時(shí)的外部添加更多從屬組件。 如果你使用C++或C語(yǔ)言,在不使用活動(dòng)模版庫(kù)(Active Template Library)的情況下從頭編寫一個(gè)Windows服務(wù),你將不得不編寫一小段代碼來(lái)協(xié)調(diào)你的服務(wù)與服務(wù)控制器(Service Control Manager,SCM)之間的往來(lái)通信,SCM用來(lái)處理服務(wù)的啟動(dòng)、暫停、繼續(xù)和停止。.NET Framework通過(guò)提供System.ServiceProcess.ServiceBase類,使得實(shí)現(xiàn)一個(gè)服務(wù)變得很容易。要編寫一個(gè)服務(wù),你可以從這個(gè)類繼承,重載它的某些方法,設(shè)置它的屬性,然后就大功告成了!
你可能要重載的一些方法包括:OnStart、OnStop、OnPause和OnContinue。通常你需要載啟動(dòng)工作線程(worker thread)的位置重載OnStart,在需要取消這個(gè)工作線程的位置重載OnStop。在你創(chuàng)建了自己的服務(wù)后,你就可以使用SCM安裝和注冊(cè)這個(gè)服務(wù)。這是另一個(gè)領(lǐng)域,.NET Framework中的基類提供了大部分所需的工作。你可以創(chuàng)建一個(gè)繼承自System.Configuration.Install.Installer的類,從System.ServiceProcess.ServiceInstaller中例示對(duì)象,然后設(shè)置它的屬性,如服務(wù)啟動(dòng)模式和服務(wù)名稱。這使得.NET安裝實(shí)用工具installUtil.exe能夠安裝(和刪除)你的服務(wù),而你無(wú)需編寫額外的代碼。
當(dāng)你開(kāi)始使用Visual Studio .NET時(shí),你將會(huì)發(fā)現(xiàn)Visual Studio .NET使得使用.NET Framework變得更容易。Visual Studio .NET允許你創(chuàng)建Windows服務(wù)(擁有安裝程序(installer)),監(jiān)控文件系統(tǒng)的變化,寫入事件記錄 - 所有都是使用設(shè)計(jì)器和組件而不是編寫代碼來(lái)完成。例如,要將一個(gè)安裝程序添加到自己的服務(wù)項(xiàng)目中,你只需選中服務(wù)設(shè)計(jì)器避免,然后單擊屬性(Properties)窗口底部的添加安裝程序(Add Installer)。這將添加一個(gè)新模塊ProjectInstaller.vb,該模塊包括安裝該服務(wù)所需的全部代碼。你可以使用設(shè)計(jì)器,對(duì)安裝選項(xiàng),如啟動(dòng)模式進(jìn)行自定義。
結(jié)論
.NET Framework使得你能夠利用Visual Basic .NET,很容易地開(kāi)發(fā)健壯地VB.NET事件處理程序。它使得你可以將重點(diǎn)放在學(xué)習(xí)一種相容的程序設(shè)計(jì)模型上,并且使得你可以直接訪問(wèn)底層的.NET平臺(tái)。利用Visual Basic .NET和.NET Framework,你可以使自己的應(yīng)用程序達(dá)到前所未有的水平。
【編輯推薦】