2012-06-11 27 views
0

Architeture概述:如何通過dll調用向可視化界面提供反饋?

語言:C#Windows窗體的項目中使用類庫來執行爬蟲任務

我目前正在寫將要使用的界面(UI),以「調試」履帶(或一組爬行者)我寫的。每個爬蟲是一個.dll

從接口,我將調用.dlls,我不想等待他們結束他們的任務(在內部爬行,解析和構建元素列表)在界面上顯示結果。

問:

有什麼辦法,我可以,不知何故,從發送該.dll該界面的反饋?

在爬行下一個元素之前,可能是一個進度條,或者在讀取元素之後,在界面上顯示它們?

我想要的是類似的東西,要實時顯示在界面上(gridview或其他)。

Finished Crawling College X 
Finished Crawling College Y 
Problem Crawling College Z - ABORTING 
Finished Crawling College K 

等等。

這樣做的好方法是什麼?

我曾考慮將Visual組件的引用發送到.dll(或secundary .dll),以便它可以在執行過程中更新可視組件本身。這樣做有什麼缺點嗎?我是否因爲這樣做而破壞了任何優秀的實踐?

在此先感謝,

Marcello。

+0

所以這些是你寫的類嗎?爲什麼不簡單地爲所有DLL(例如暴露進度方法的接口)創建一個已知類型,然後與接口中正在執行的DLL類進行交互? – Tejs

+0

暴露進度方法意味着什麼? 您在談論一個對於爬網程序和UI都可見的類,它將在爬蟲的每一步之後繼續更新UI? 就像一個「中場球員」? –

+0

您如何運行抓取工具? –

回答

2

基本上,你可以做這樣的事情:

public interface ICrawler 
{ 
    void StartCrawling(Action<SomeCrawlingMessageType> callback); 
} 

而且在你的DLL一些類,它實現這一點。然後你傳入一個回調函數,你的爬蟲類可以調用將消息發送回調用者。

在回調中,您可以接收傳遞給您的數據,並通過異步調用UI更新來更新UI,即使是來自多個搜尋器。

+0

你使用的是什麼名字?我的意思是,我應該照顧什麼來做到這一點? 動作回調C#? –

+0

'Action'只是一個通用的委託類型 - 您可以使用任何想要發送消息的委託類型。在實際的實現中,只要您想發送消息,就可以簡單地調用回調函數。 – Tejs

+0

我正在努力做到這一點。 只是另一個問題:我的用戶界面調用一個.dll調用secundary類secundary方法。類的最後一個「層」是我想發送消息的那個人。 我可以在那裏寫回調函數,還可以在UI中編寫其他部分,或者是否需要將回調函數發送回每個圖層,以便它能夠與UI一起發送回來? –

0

如何在每個crawler dll中創建事件,然後在主UI中訂閱每個事件並報告/顯示結果。

+0

你的意思是,宣佈我自己的事件並在爬蟲每一步之後觸發它們? 如果我的主線程(UI)正在監聽事件,它是否會處理它們而不會崩潰.dlls? 有沒有你可能給我的參考? –

+0

你可能會考慮檢查[MSDN教程](http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx)。我不是100%相信這是解決方案,但是它有一個很好的機會,你真的應該知道事件是如何工作的。 – tmesser

+1

@MarcelloGrechiLins是的,創建自己的事件。 UI應該能夠處理這些事件。有關來自MSDN的事件,請參閱YYY鏈接。此外,如果在DLL正在抓取時仍然需要在UI中執行某些操作,則可以通過BackgroundWorker或單獨的線程放棄該進程......這樣一來,抓取工具在執行工作時UI仍然保持響應。 – ganders

相關問題