【发布时间】:2016-09-24 13:34:26
【问题描述】:
我的小应用程序出现严重问题;基本上很容易理解:
我的软件,当打开时,做它的事。
我想专注于打开另一个实例(我的意思是再次打开.exe),检查它是否已经打开。如果不是简单地启动应用程序,而是如果它已经在运行(也就是第二个或更多实例)“简单地”将输入参数(args 字符串数组)传递给第一个实例,则会适当地处理它。
这是我的程序.cs
static class Program
{
static Mutex mutex = new Mutex(true, "{blabla}");
[STAThread]
static void Main(String[] args)
{
if (mutex.WaitOne(TimeSpan.Zero, true))
{
//First Instance!
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
CALL A MY STATIC METHOD, DO SOME THINGS
Application.Run(new Form1());
}
finally
{
mutex.ReleaseMutex();
}
}
else
{
//Not-so-first instance!
CALL A STATIC METHOD,
DO OTHER THINGS LIKE COMUNICATE WITH FIRST INSTANCE
SIMPLY CLOSE.
}
}
}
只有当它已经打开但(当然)它不能与主实例通信时,它才会识别(使用互斥锁)。
我已经尝试了很多东西,但我无法让它发挥作用。
我试过this,但我真的不明白(在浪费了很多时间之后)如何放置我的“第一次”代码和“已经运行”的代码。
也试过MSMQ,但我不能让它工作。
有人可以帮帮我吗?这是一个基本的软件,可以做一些非常基本的事情,但我花了一天时间让它按我想要的方式工作!
【问题讨论】:
-
您的第二个实例在不同的进程中运行。您必须实现某种通信机制——MSMQ、通过套接字进行序列化等。使事情
static不会这样做。您正在运行同一可执行文件的多个副本这一事实并不比在不同应用程序之间进行通信更简单。 -
不幸的是,我今天了解到与另一个程序通信并不容易,即使它是同一个可执行文件。我知道不同的副本必须以不同的方式进行管理,而不是使所有内容都静态化;我编写的静态方法在另一个 .cs 文件中,并在我的程序逻辑中使用:与问题无关:)
标签: c# arguments pipe instance msmq