C#如何实现进程单例运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#如何实现进程单例运行相关的知识,希望对你有一定的参考价值。
参考技术A 1,在program.cs文件中添加函数如下:public static System.Diagnostics.Process RunningInstance()
System.Diagnostics.Process current = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process process in processes) //查找相同名称的进程
if (process.Id != current.Id) //忽略当前进程
//确认相同进程的程序运行位置是否一样.
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", @"\") == current.MainModule.FileName)
//Return the other process instance.
return process;
//No other instance was found, return null.
return null;
2,把Main ()函数改为如下代码:
static void Main()
if(RunningInstance()==null)
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
else
MessageBox.Show("已经运行了一个实例了。");
C#中的单例实现问题
【中文标题】C#中的单例实现问题【英文标题】:singleton implementation problem in C# 【发布时间】:2011-04-11 16:08:13 【问题描述】:--ConsoleApplication 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
public class MsgService
private static CreateConnectionToA _instanceA;
private static CreateConnectionToB _instanceB;
protected MsgService()
public static MsgService GetInstanceA(string paramA, string paramB)
if (_instanceA != null)
return _instanceA;
return _instanceA = new CreateConnectionToA("p1","p2");
public static MsgService GetInstanceB(string paramA, string paramB)
if (_instanceB != null)
return _instanceB;
return _instanceB = new CreateConnectionToB("p1", "p2");
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
class CreateConnectionToB : MsgService
public CreateConnectionToB(string param1, string Param2)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
class CreateConnectionToA : MsgService
public CreateConnectionToA(string param1, string Param2)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
class Program
static void Main(string[] args)
MsgService.GetInstanceA("p1", "p2");
Console.Read();
--ConsoleApplication 2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
class Program
static void Main(string[] args)
Console.WriteLine("Press");
Console.Read();
ConsoleApplication2.MsgService.GetInstanceA("p1", "p2");
Console.Read();
我正在尝试进行 simgleton 实现,但我的方法有问题。它总是从每个控制台应用程序创建 _instanceA 和 _instanceB 的新实例。
有人可以指出这里需要做什么吗?
【问题讨论】:
【参考方案1】:您需要命名互斥体来实现进程间同步。
【讨论】:
直截了当,是的。如果我们不受实现选择的限制,而只是尝试实现一个表现为单例的远程服务,我强烈建议查看 WCF(它有能力这样做)。 yoda.arachsys.com/csharp/singleton.html Jon Skeet 的单例是在它存在于一个进程中的前提下编写的。不过还是不错的。 请提供命名互斥锁的示例? @Asdfg:您能否准确描述您正在尝试做的事情,而不使用单例和文字服务这个词? 我正在尝试创建 _instanceA 和 _instanceB 的一个实例,无论调用如何。在 ConsoleApplication1 中,它工作正常,但在 ConsoleApplication2 中,空检查失败并创建新实例。我希望 _instanceA 和 _instanceB 在内存中。【参考方案2】:在两个应用程序之间共享一个对象实例有点困难,因为默认情况下它们在不同的应用程序域中运行。要完成我认为您正在尝试做的事情,您需要要么
跨应用程序域边界封送,或 在共享的应用程序域中运行这两个进程。编写第三个进程——shell——负责在共享的应用程序域中生成/托管其他两个进程。http://www.codeproject.com/KB/dotnet/AppDomainMemImprovement.aspx
Sharing data between AppDomains
【讨论】:
以上是关于C#如何实现进程单例运行的主要内容,如果未能解决你的问题,请参考以下文章