我們有許多類作爲singlecalls發佈在遠程處理通道中。該應用程序駐留在Windows服務中。它們在下列情況下使用:遠程處理通道調用Dispose方法兩次,同時從客戶端處置SingleCall對象
- 從使用CrossAppDomain遠程通道
- 通過網絡從遠程客戶端使用TCP信道
由於在這三種情況下使用了這些類中的一些,我們有一些通用代碼可以與它們進行操作,例如:
using(IRemoteObject remoteObject= (IRemoteObject)
RemotingHelper.GetObject(typeof(IRemoteObject)))
{
remoteObject.DoStuff();
}
RemotingHelper已經知道如何根據場景創建對象。這是對Ingo Rammer的一個修改。
所有遠程對象接口都從IDisposable繼承,並且所有遠程對象都繼承自MarshalByRefObject。
因此,在前兩種情況下使用此代碼的情況下,代碼的行爲是正確的,但通過實際遠程使用時,遠程對象會創建兩次並處理兩次。
這是因爲Dispose()方法調用,一個由使用言言,被管理作爲一種新的遠程調用,但遠程infraestructure已經調用該對象的Dispose自動,因爲這是怎麼了表現爲SingleCall對象:每次調用都會創建一個新實例並自動處理它。
是否有任何配置值來避免這些重複(冗餘)調用?
編輯:我已經知道爲什麼會發生這種情況。對於遠程SingleCall IDisposable對象,遠程處理通道在Method返回後自動調用Dispose,第二個調用由客戶端生成的代理完成,導致在服務器端實例化新對象,僅用於調用Dispose方法。
這第二個電話是我想避免的,因爲它是不需要的。
爲什麼你需要在客戶端在所有處置?看起來,你可以從客戶端代碼中刪除(...)。 – VladV 2010-10-10 20:26:29
我們不需要,我們在某些情況下這樣做,但我們有在案件2和3使用的幫手一些公共庫,我們希望避免編寫不同的助手。 – jmservera 2010-10-11 07:30:48