我遇到以下问题:

我有一个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()逻辑移至CloseMainWindow事件:

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/

10-10 14:36