2010-11-04 116 views
1

我使用第三方DLL從他們的服務器獲取一些數據。有一個無效的方法,我打電話,然後我訂閱通過調用此方法引發的事件。引發的事件通過參數返回數據。第三方DLL提高事件

so, 調用:void getdata(id) raises:void onReturn(object) - >它返回一個包含數據的對象。

這WORKS每次當存在的GetData單個呼叫(ID)

問題是,當i循環通過ID的列表,並且該循環呼叫的GetData(ID),用於該列表內時,相應的事件沒有適當提升。 對於10個ID的列表,有10個調用getdata(id),但只有少數onReturns被引發。

返回的對象還返回傳遞給getdata(id)的id,這樣我就可以匹配我發送的數據和我收到的數據。

有沒有辦法確保所有事件都能被聽取?所以如果我通過getdata(id)發送10個ID,我想確保處理10個onReturns。

而且我使用C#,.NET 4.0

感謝

+0

您是否註冊了返回事件或者是否存在您作爲回調傳遞的委託? – 2010-11-04 15:04:57

+0

註冊返回事件。 – mike 2010-11-04 18:32:59

回答

1

如果它是一個第三方的DLL,也沒有告訴他們如何實現它。當您在調試模式下步進時,是否在調用onReturn()偵聽器之前通過getData()的呼叫?如果是這樣,它可能會在內部使用線程(或至少是異步偵聽器),並且多次調用多個可能會導致它踩到未決響應。

我認爲嘗試解決這個問題的唯一方法是自己使用多線程,例如,帶有一個Mutex,在getData()的調用之後等待並在onReturn()事件中發佈。這樣,你一次只能有一個優秀的請求,這似乎是適合你的條件。

編輯:你有沒有跟第三方供應商討論過這個問題呢?我猜他們的支持不是最好的,如果你首先想到我們,但可能值得一試。

編輯第二條:當你說它從服務器獲取數據時,這是否意味着它通過網絡發出請求?如果這些請求沒有加密,也許你可以對協議進行逆向工程,爲自己製作一個新的API,而不是依賴經過驗證的錯誤黑盒。

+0

+1,對於這是在工作線程中引發的事件的可能性達成了一致。讓getdata()不僅僅是返回數據沒有多大意義。是的,得到供應商的支持。 – 2010-11-04 16:07:01

+0

它是一個老的DLL,他們不再支持它。但我們仍然使用它。我會試試你的解決方案。 感謝您的反饋意見。 – mike 2010-11-04 16:53:58