繁体   English   中英

将.NET类限制为计算机边界上的单个对象实例=>“进程间单例”

[英]Limiting .NET Class to single object instance on computer boundary => “inter-process singleton”

我想让同一计算机上的多个进程使用某个.NET类的对象。

具有应用程序域,很难跨越该边界,但是.NET 4.0中的内存映射文件应以某种方式简化该任务。

在.NET 4.0最终版本发布之前...是否可以在C#中制作某种“进程间单例”?

是的,您可以在一个进程中创建.Net Remoting单例,并通过Remoting将其公开给在同一计算机上运行的其他进程。

编辑:在.Net 2.x中,您需要使用Remoting解决方案,但是在.Net 3.x或更高版本(其中WCF可用) 中,可以使用WCF 使用相同的功能(签出)...

您可能要使用全局互斥锁。

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\\ “,如果未指定前缀,则为默认值。

您可以在MSDN中找到有关Mutex的更多详细信息:Mutex类

在全局程序集缓存中安装.net dll。 然后,计算机上的任何应用程序都可以引用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM