我应该如何处理创建的服务器&管理MarshalByRefObject?

时间:2014-12-23 14:41:04

标签: c# remoting

我已经阅读了一些有关远程处理的内容,但几乎所有内容似乎都来自于调用服务器的孩子的上下文,所以我对我应该在这里做的事情感到很困惑。

我有一个.NET 3.5服务器应用程序,它将一组C#脚本编译到一个单独的应用程序域中。对此应用程序域的所有调用都是同步的,它们会获得一个新创建的'provider'对象,继承MarshalByRefObject,它们可以用来从服务器应用程序域访问功能。

所以我有以下大量简化的示例,在服务器appdomain中运行:

object RunScript()
{
    var myProvider = new MyProvider(this); // Inherits MarshalByRefObject 

    // Passes myProvider to the script appdomain
    var results = CallAMethodInScriptAppDomain(myProvider); 

    // I want myProvider to be garbage collectable from here.

    return results;
}

我过去曾尝试让它与赞助商和租约合作,但无论我做了什么,它仍然被收集。我认为那是因为它们被设计为从客户端使用,我试图从服务器管理这个对象的生命周期。

事实是我确切地知道服务器appdomain中的哪一行代码我希望它被收集(或者更确切地说是可收集的),并且无论脚本调用花了多长时间,都不得在此之前收集它(大多数脚本)呼叫将在几毫秒的数量级,但理论上有些可能需要几个小时。)

目前我的InitializeLifetimeService返回null,因为这是我在脚本运行时无法收集它的唯一方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

InitializeLifetimeService应返回一个ILease实现,您可以使用该实现注册ISponsor实现。当您完成服务器类时,赞助商可以拥有一个设置为true的属性,当框架在租约上调用Renewal时,如果Finished为false,您的赞助商可以检查该属性并续订租约。

本文解释的是qutie很好:http://msdn.microsoft.com/en-us/magazine/cc300474.aspx

并且有可以复制的代码。