程序互斥怎么做?我用System.Threading.Mutex mutex = new System.Threading.Mutex(false, "1111213213508")没效果.内详

boyyao 2006-03-28 10:37:17
我想让一个程序只能运行一次.执行文件名可能更改的情况下.
我的环境是vs2005.我在program.cs中的main方法中加入以下代码:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

//声明互斥体。
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "123213213");
//判断互斥体是否使用中。
bool Running = !mutex.WaitOne(0, false);
if (!Running)
{
//Application.Run(new Form1());
Application.Run(new UserLogin());
}
else
{
MessageBox.Show("程序已经在运行");
}


但是当我一个程序是从ide的启动程序(不管是调试还是释放模式)运行后在在生成的目录下运行就会有效果.程序会提示"程序已经在运行".但是当我直接在生成目录中多次运行却没有任何效果.为什么??
...全文
835 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Knight94 2006-03-30
  • 打赏
  • 举报
回复
很怪,我怎么使用都没问题,
你的环境是什么
boyyao 2006-03-30
  • 打赏
  • 举报
回复
已经搞定了.
另外做个方法.不能放在Main方法中.估计是和楼上得朋友说得.被回收了

private static System.Threading.Mutex mutex;
private static bool runone()
{
bool one;
mutex= new System.Threading.Mutex(true, "123213213", out one);
return one;
}
boyyao 2006-03-30
  • 打赏
  • 举报
回复
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
bool blnNewCreated;
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "123213213", out blnNewCreated);
if (blnNewCreated)
{
//Application.Run(new Form1());
Application.Run(new UserLogin());
}
else
{
MessageBox.Show("程序已经在运行");
}
}

Main方法修改成以上这样.可是程序已然能重复运行.其实我也查找过一些别人得做法.基本上就是以上这样得.可是为什么我这里就不行??求教..谢谢了..
Knight94 2006-03-30
  • 打赏
  • 举报
回复
to Knight94(愚翁) 的第一种不就是我用的方法么?

我的方法不你用的,你仔细看看
有一个out参数,是判断是否新建,在VS2005下代码要稍作修改,如下:
bool blnNewCreated;
Mutex m = new Mutex(false, yourMutexString, out blnNewCreated);

然后你用blnNewCreated去判断,如果为true则需要运行;否则不能运行,已经存在。
Knight94 2006-03-30
  • 打赏
  • 举报
回复
你的写法错了

bool Running = !mutex.WaitOne(0, false);
改成
bool Running = !mutex.WaitOne(0, true);//Using "true" here
boyyao 2006-03-30
  • 打赏
  • 举报
回复
帖子提前..^_^
boyyao 2006-03-29
  • 打赏
  • 举报
回复
是在不好意思.资质不好.还是没看明白以上的
Knight94(愚翁) 的第一种不就是我用的方法么?,第2种如果改了文件名呢?
tiaoci(我挑刺,我快乐) 和XiangDong(吸血蝙蝠) 应该是说的同一个方法吧?请问具体如何操作?谢谢了.
boyyao 2006-03-28
  • 打赏
  • 举报
回复
可否详细一点?非常感谢.
真相重于对错 2006-03-28
  • 打赏
  • 举报
回复
共享内存文件
XiangDong 2006-03-28
  • 打赏
  • 举报
回复
1. 需要"Global\" or "Local\" 前缀。
2. 需要有与程序生命期相同的引用。
tiaoci 2006-03-28
  • 打赏
  • 举报
回复
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "123213213");

这个mutex的申明要放到模块级/全局

否则会被回收的吧
Knight94 2006-03-28
  • 打赏
  • 举报
回复
参看
http://blog.csdn.net/knight94/archive/2006/03/16/625809.aspx

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧