Mutex не работает, как ожидалось при загрузке настроек формы

На основе статьи проекта кода в пользовательских настройках Windows Forms David Veeneman, я играл с сохранением начального местоположения и начал размер приложения.

Он отлично работает в одном экземпляре, но когда я расширяю его на несколько экземпляров, я сталкиваюсь с проблемами.

Я обернул раздел, посвященный загрузке настроек и сохранению настроек в мьютексе, чтобы защитить запись в файл настроек и из него.

Я бы хотел, чтобы окна стекали из последнего известного местоположения. Кажется, что это работает отлично в большинстве случаев, но если я открою четыре или пять окон быстрого ускорения, первые три откроются отлично, тогда будет разрыв, и после этого некоторые из них начнут открываться в том же месте.

Оформить форму/заявку:

 private Mutex saveSetting;
 private const int START_LOCATION_OFFSET = 20;

 private void MainForm_Load(object sender, EventArgs e)
    {
       //Get the mutex before the reading of the location
       //so that you can't have a situation where a window drawn
       //in the incorrect position.

        this.saveSetting = new Mutex(false, "SaveSetting");
        this.saveSetting.WaitOne();

        this.LoadWindowStartSizeAndLocation();
        .
        .
        .
        .
        .

        this.saveSetting.ReleaseMutex();
    }

Загрузка настроек:

private void LoadWindowStartSizeAndLocation()
        {
           //Set window location
            if (Settings.Default.WindowLocation != null)
            {
                System.Drawing.Point startLocation = 
                  new System.Drawing.Point
                     (Settings.Default.WindowLocation.X + START_LOCATION_OFFSET,
                      Settings.Default.WindowLocation.Y + START_LOCATION_OFFSET);

                this.Location = startLocation;
                Settings.Default.WindowLocation = startLocation;

                Settings.Default.Save();
            }

           //Set window size
            if (Settings.Default.WindowSize != null)
            {
                this.Size = Settings.Default.WindowSize;
            }
        }

Сохранение настроек:

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        try
        {
            this.SaveWindowSizeAndLocationForNextStart();                
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Assert(false, ex.Message);
        }
    }

    /// 
    /// Save the Window Size And Location For the next Application Start up.
    /// 
    private void SaveWindowSizeAndLocationForNextStart()
    {
        if (this.WindowState != FormWindowState.Minimized)
        {
           //Copy window location to app settings
            Settings.Default.WindowLocation = this.Location;
            Settings.Default.WindowSize = this.Size;
        }
        try
        {
            this.saveSetting = new Mutex(false, "SaveSetting");
            this.saveSetting.WaitOne();

           Settings.Default.Save();
        }
        catch
        {
           //Do nothing. It won't permanently disable the system if we
           //can't save the settings.
        }
        finally
        {
            this.saveSetting.ReleaseMutex();
        }
    }

Может ли кто-нибудь сказать мне, что я делаю? Или как на основе вышеприведенного кода я могу получить два экземпляра, перенесенных в одно и то же начальное местоположение?

благодаря

0
nl ja de

1 ответы

Проблема в том, что настройки загружаются до получения мьютекса. Вызовите Settings.Default.Reload() после получения мьютекса.

1
добавлено
Я не думал об этом. Я тестирую это сейчас.
добавлено автор AidanO, источник
Спасибо, что делает трюк
добавлено автор AidanO, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot