gpt4 book ai didi

c# - 互斥体不再工作

转载 作者:太空宇宙 更新时间:2023-11-03 13:28:25 25 4
gpt4 key购买 nike

我遇到了以下问题:

我有一个 Loadscreen 和 MainWindow。每次我运行该应用程序时,Loadscreen 首先出现,几秒钟后关闭,然后 MainWindow 打开。我的问题是,如果应用程序已经在运行,Mutex 不会检查。你知道我的谬论吗?

应用程序.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();” --> 但我希望 Loadscreen 先出现。在这种(第一种)情况下,Loadscreen 被忽略。

最佳答案

这里的问题是您正在关闭 Mutex一旦你的LoadScreen关闭了。

在您更改 MainWindow 中的代码之前至 LoadScreen ,它工作正常。现在,发生的是 Mutex LoadScreen 时关闭关闭,一旦MainWindowTimer 之后打开流逝,没有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完好无损。

另一方面,您应该对局部变量使用驼峰命名约定;

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/

25 4 0