将 .NET 类限制为计算机边界上的单个对象实例 =>“进程间单例”
Posted
技术标签:
【中文标题】将 .NET 类限制为计算机边界上的单个对象实例 =>“进程间单例”【英文标题】:Limiting .NET Class to single object instance on computer boundary => "inter-process singleton" 【发布时间】:2009-08-08 19:57:48 【问题描述】:我想让同一台计算机上的多个进程使用某个 .NET 类的一个对象。
拥有应用程序域,跨越该边界并不容易,但 .NET 4.0 中的内存映射文件应该以某种方式简化该任务。
直到 .NET 4.0 最终发布... 是否可以在 C# 中制作某种“进程间单例”?
【问题讨论】:
【参考方案1】:是的,您可以在一个进程中创建一个 .Net Remoting 单例,并通过 Remoting 将其公开给在同一台机器上运行的其他进程...
编辑:在 .Net 2.x 中,您需要使用 Remoting 解决方案,但在 .Net 3.x 或更高版本(WCF 可用)中,同样的功能可能可使用 WCF (看看)...
【讨论】:
这应该通过 WCF 完成,而不是远程处理。远程处理已弃用,取而代之的是 WCF。 @John,谢谢,我承认我对 WCF 的细节没有我应该的那么熟悉......我一直在工作的地方,我只能使用 CLR 3.x 或WCF 的东西.. 现在了解更多信息 根据给定的要求,我认为通过 WCF 是不可行的。 .NET Remoting 将确保始终保留对象标识,而 WCF 不会。此外,对 Remoting 的“弃用”应该持保留态度 - 它只是在设计原则上与 WCF 完全不同的技术,因此,在某些情况下,其中一个或另一个做得更好。【参考方案2】:您可能想要使用全局互斥锁。
Threading in C# 有一个很好的示例(为方便起见,复制如下),说明如何使用命名互斥锁确保只有一个应用程序实例可以在机器上运行。
您可以扩展此示例以确保对象也只有一个实例。
class OneAtATimePlease
// Use a name unique to the application (eg include your company URL)
static Mutex mutex = new Mutex (false, "oreilly.com OneAtATimeDemo");
static void Main()
// Wait 5 seconds if contended – in case another instance
// of the program is in the process of shutting down.
if (!mutex.WaitOne (TimeSpan.FromSeconds (5), false))
Console.WriteLine ("Another instance of the app is running. Bye!");
return;
try
Console.WriteLine ("Running - press Enter to exit");
Console.ReadLine();
finally mutex.ReleaseMutex();
您可能还需要注意一件事。
当在终端服务中运行的服务器上使用命名互斥体时,命名互斥体可以有两个级别的可见性,全局对所有会话(名称前缀为"Global\
") 或 Local 到终端服务器会话(名称以“Local\
”为前缀,如果未指定前缀,则为默认值)。
您可以在MSDN: Mutex Class 中找到有关 Mutex 的更多详细信息。
【讨论】:
此代码阻止第二个进程创建新对象,但不让他引用已经存在的对象。有什么解决办法吗?另外,感谢您的时间... 我会推荐 WCF 用于进程间通信。一般来说,NetNamedPipeBinding 是机器内进程间通信的不错选择。【参考方案3】:在全局程序集缓存中安装您的 .net
dll。然后它可以被计算机上的任何应用程序引用。
【讨论】:
很确定他指的是实例而不是定义。 没错,我需要更多的进程来使用同一个object,而不是同一个类。以上是关于将 .NET 类限制为计算机边界上的单个对象实例 =>“进程间单例”的主要内容,如果未能解决你的问题,请参考以下文章
如何调整 Levenshtein 距离算法以将匹配限制为单个单词?