我遇到以下问题:
我有一个Loadscreen和MainWindow。每次我运行该应用程序时,首先都会出现Loadscreen,然后在几秒钟后关闭,然后打开MainWindow。我的问题是,互斥对象不检查应用程序是否已在运行。你知道我的谬误吗?
App.xaml:
public void Application_Startup(object sender, StartupEventArgs e)
{
bool Absicherung;
Mutex Mutex = new Mutex(true, this.GetType().GUID.ToString(), out Absicherung);
if (Absicherung)
{
Window W = new Loadscreen();
W.Closed += (sender2, args) => Mutex.Close(); ;
W.Show();
}
else // ...
我的任何Loadscreen.xaml.cs:
public void Timer_Tick(object sender, EventArgs e)
{
progressBar_Ladebalken.Value = i;
label_Titel.Content = i + "%";
if (i < 100)
{
i += 1;
}
else
{
i = 0;
Timer.Stop();
Window W = new MainWindow();
W.Show();
this.Close();
}
}
请不要:在我更改“ Window W = new MainWindow();”之前,此方法起作用了。到“ Window W = new Loadscreen();” ->但我希望首先载入屏幕。在这种(第一种)情况下,将忽略“加载屏幕”。
最佳答案
这里的问题是您要在Mutex
关闭后立即关闭LoadScreen
。
在将代码从MainWindow
更改为LoadScreen
之前,它可以正常工作。现在,发生的情况是在Mutex
关闭时LoadScreen
关闭了,并且MainWindow
经过后一旦Timer
打开,就没有Mutex
,并且可以打开该应用程序的另一个实例。
要解决此问题,您需要将Mutex.Close()
逻辑移至Close
的MainWindow
事件:
public void Application_Startup(object sender, StartupEventArgs e)
{
bool Absicherung;
Mutex Mutex = new Mutex(true, this.GetType().GUID.ToString(), out Absicherung);
if (Absicherung)
{
Window W = new Loadscreen();
// W.Closed += (sender2, args) => Mutex.Close(); remove this from here
W.Show();
}
.,. Mode code
}
相反,请在此处添加它:(请参阅代码中的注释)
public void Timer_Tick(object sender, EventArgs e)
{
progressBar_Ladebalken.Value = i;
label_Titel.Content = i + "%";
if (i < 100)
{
i += 1;
}
else
{
i = 0;
Timer.Stop();
Window W = new MainWindow();
// add the Close event handler here, and this will ensure your previous
// logic of closing the Mutex when the MainWindow, not the LoadScreen, closes.
W.Closed += (sender, args) => Mutex.Close();
W.Show();
this.Close();
}
}
这应该修复您的
Mutex
逻辑并保持您的LoadScreen
完整。另外,您应该对局部变量使用camelCase命名约定。
Mutex Mutex = new Mutex();
Window W = new MainWindow();
应该
Mutex mutex = new Mutex();
Window w = new MainWindow();
这种方式在C#中是标准的。
关于c# - 互斥体不再工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21499013/