【发布时间】:2014-12-23 23:24:35
【问题描述】:
我已经阅读了很多关于远程处理的内容,但几乎所有内容似乎都来自调用服务器的孩子的上下文,所以我很困惑我应该在这里做什么。
我有一个 .NET 3.5 服务器应用程序,它将一组 C# 脚本编译到一个单独的应用程序域中。对该应用程序域的所有调用都是同步的,它们会获得一个新创建的“提供者”对象,该对象继承 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,因为这是我在脚本运行时不收集它的唯一方法。
有什么想法吗?
【问题讨论】:
-
欢迎来到 Stack Overflow! Remoting 是一项遗留技术,保留它是为了与现有应用程序向后兼容,不建议用于新开发。现在应该使用 WCF 或 ASP.NET Web API 开发分布式应用程序。请参阅msdn.microsoft.com/en-us/library/vstudio/xws7132e.aspx 顶部的注释以获取证据。
-
这并不是真正的新开发,它已经有 5 年历史了,我们刚刚有了一个新客户端,它在脚本系统上的工作量要大得多,这意味着我在瞬间变成了一个问题。请注意,这不是一个“分布式”应用程序,它都在一个进程中运行。只是出于沙盒和重新编译目的而位于它们自己的 AppDomain 中的脚本,它们之间的通信使用远程处理。 WCF 是否仍然适用于该场景?
-
是的,如果这是新开发,WCF 将适用。我相信有针对内存场景优化的通道类型。
-
@JohnSaunders 好吧,在某些情况下 .NET Remoting 仍然有用。例如跨 AppDomain 交换数据。与 WCF 相比,它更快。