韓鳳寧
同濟(jì)大學(xué)軟件學(xué)院,上海 330027
EventHandler在SharePoint中起到事件處理的作用。當(dāng)用戶使用SharePoint進(jìn)行一些操作時(shí),比如上傳一個(gè)文件,EventHandler相應(yīng)的事件處理函數(shù)便會(huì)截獲此事件,執(zhí)行開發(fā)人員在此函數(shù)中重寫的功能代碼,從而實(shí)現(xiàn)一系列動(dòng)作事件。在SharePoint中,EventHandler依據(jù)SharePoint的層次結(jié)構(gòu)和功能分為 Web Level、List Level、ListItem Level、Email,分別繼承了SPWebEventReceiver、SPListEventReceiver、SPItemEventReceiver、SPEmailEventReceiver類。開發(fā)人員根據(jù)實(shí)際需求在相應(yīng)的子類中實(shí)現(xiàn)具體的功能。
該類的命名空間為Microsoft.SharePoint.SPItemEventReceiver,用來處理發(fā)生在ListItems上的觸發(fā)事件。開發(fā)人員創(chuàng)建子類,并繼承SPItemEventReceiver類,來實(shí)現(xiàn)實(shí)際問題中的觸發(fā)事件。圖1為SPItemEventReceiver類的結(jié)構(gòu)。
圖1 SPItemEventReceiver類結(jié)構(gòu)
當(dāng)用戶向文檔庫(kù)上傳文檔時(shí),要用到SPItemEventReceiver類的ItemAdded()方法去處理文檔上傳時(shí)的一系列動(dòng)作。在實(shí)際需求中,會(huì)在SharePoint項(xiàng)目中引入外部動(dòng)態(tài)鏈接庫(kù),即調(diào)用DLL文件。在此介紹的DLL文件實(shí)現(xiàn)的功能是將上傳的文檔進(jìn)行文字提取,這個(gè)文字提取的執(zhí)行過程將會(huì)占用至少1分鐘的時(shí)間。如圖2為事件觸發(fā)后的一系列過程。
在ItemAdded方法中調(diào)用外部動(dòng)態(tài)鏈接庫(kù),在實(shí)際項(xiàng)目開發(fā)中是經(jīng)常會(huì)遇到的情況,然而這也引起了一些問題。如果外部動(dòng)態(tài)鏈接庫(kù)不支持多線程,那將會(huì)在執(zhí)行過程中出現(xiàn)一些異常,從而使上述系列過程不能正常完成。當(dāng)用戶在上一個(gè)過程還未完成時(shí)就上傳了第二個(gè)文檔,那么這時(shí),第二個(gè)文檔的線程會(huì)終止掉第一個(gè)文檔的線程,造成第一個(gè)文檔無法處理完成。
圖2 觸發(fā)后處理的事件
ItemAdded本身是支持多線程的,但是由于外部動(dòng)態(tài)鏈接庫(kù)的引入,而這個(gè)動(dòng)態(tài)鏈接庫(kù)并不支持多線程,這就造成多次觸發(fā)時(shí),不能正常完成每個(gè)文檔上傳后的整個(gè)處理過程。這時(shí)的解決方法,就是在ItemAdded方法中手動(dòng)創(chuàng)建線程。每當(dāng)ItemAdded被觸發(fā),就創(chuàng)建一個(gè)線程,來單獨(dú)處理本次觸發(fā)后的系列過程。由于調(diào)用動(dòng)態(tài)鏈接庫(kù)的部分是不支持多線程的,所以這部分的執(zhí)行代碼將被放到共享池中作為共享資源被加鎖。具體執(zhí)行代碼如下:
在Sharepoint EventHandler中支持多線程,可以把占用長(zhǎng)時(shí)間的觸發(fā)過程放到后臺(tái)處理,使得EventHandler得以空閑出來去處理下一個(gè)觸發(fā)過程,而且下一個(gè)觸發(fā)過程并不會(huì)影響上一個(gè)過程的執(zhí)行,這樣就保證了每一個(gè)觸發(fā)過程單獨(dú)完整的執(zhí)行。
[1]http://blog.csdn.net/forever_kingdom/article/details/4516651.
[2]Multithreading Part 2: Understanding the System.Threading.Thread Class.http://www.c-sharpcorner.com/UploadFile/mmehta/Multithreading211162005044506AM/Multithreading2.aspx.
[3]Scot Hillier.Microsoft SharePoint Building Office 2007 Solutions in C#2005Apress, 2007.
[4]John Holliday,John Alexander.Professional SharePoint 2007 Development Wiley Publishing Inc.