簡體   English   中英

C#中的遠程處理程序和析構函數

[英]remoting and destructors in c#

我正在使用.net遠程功能,有些東西我無法弄清楚,也無法在Google中找到答案,這是對象處理的工作方式。

我嘗試通過遠程實現某種對象池,因為我列出了靜態對象,這些對象基本上是一個字符串和布爾狀態指示器。

當我請求一個新的遠程對象時(在構造函數期間),我檢查池中是否有空閑的池,將其標記為正在使用中以及在銷毀對象期間。 DismisObject只是將其標記為“免費”,

  public class MyRemotableObject : MarshalByRefObject,IDisposable
{

    private AdvancedString obj;
    public MyRemotableObject()
    {
        aso = strCache.GetFreeObject();
    }
    ~MyRemotableObject()
    {
        Destroy();
    }
    public void Dispose()
    {
        Destroy();
    }
    public void SetMessage(string message)
    {
        if (obj== null) { obj= strCache.GetFreeObject(); }
        obj.str= message;
    }
    public string GetMessage()
    {
        return obj.str;          
    }
    void Destroy()
    {
        if (obj!= null)
        {
            obj.DismisObject();
            obj = null;
        }
    }
}

超時可以正常工作-當我嘗試使用該對象時,經過5分鍾的活動后,我得到了遠程處理異常,但是未調用〜MyRemotableObject()而不是Dispose()函數,因此該對象在池中從未標記為空閑。 即使我關閉程序,對象仍然在池中保持活動狀態。 釋放它的唯一方法是手動調用Dispose函數(例如,程序崩潰或用戶離開時,我就無法打開它)

有沒有辦法在關閉連接時強制.net處理/銷毀對象? (我發現某個地方的CG應該偶爾執行一次,所以我打開了4個客戶端,使2個客戶端崩潰了-一段時間后其他2個客戶端斷開了連接,但objcets仍然標記為活動狀態)

您可以使用ITrackingHandler跟蹤對象斷開連接的時間,然后在該點運行Dispose代碼。

盡可能usingusing構造中實現IDisposable的對象。

例如

using (var remotableObj = new MyRemotableObject())
{
    // use it
}

更多信息在這里這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM