Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Mutex - synchronizace více aplikací

Aktivity
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:9.4.2014 18:38

Ahoj, potřeboval bych radu. Snažím udělat "aplikaci", která nedovolí čtení souboru z více instancí najednou.

Posílám kompletní kód. Pojmenování je snad víc než jasné.

Mutex mutex = new Mutex(false, "MutexTestApp");
       public Form1()
       {
           InitializeComponent();
           btnUnlock.Enabled = false;
           lbStatus.Text = "Odemčeno";
       }

       private async void btnLoad_Click(object sender, EventArgs e)
       {
           //čeká na odemčení
           mutex.WaitOne();
           btnLoad.Enabled = false;

           lbStatus.Text = "Načítám data";
           txBox.Text = await Task.Run(() =>
           {
               Thread.Sleep(3000);
               return "Dlouze načítaný text pomocí async Task";
           });
           btnUnlock.Enabled = true;
           lbStatus.Text = "Zamčeno";
       }

       private void btnUnlock_Click(object sender, EventArgs e)
       {
           btnLoad.Enabled = true;
           btnUnlock.Enabled = false;
           txBox.Text = string.Empty;
           lbStatus.Text = "Odemčeno";
           // odemče Mutex
           mutex.ReleaseMutex();
       }

Místo načítání ze souboru mám pouze asynchronní Task, kde si chviličku pospí a načte "soubor". Synchronizace funguje téměř dobře, až na to, že jakmile je mutex zamknutí (WaitOne) a druhá instance aplikace chce načítat, tak zamrzne - čeká na odemčení.

Takže celý problém je ve WaitOne. Jak docílit zjištění, že Mutex je zamknutý, upozornit uživatele ale vyhnout se zamrznutí aplikace ? Díky

Odpovědět
9.4.2014 18:38
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:9.4.2014 19:14

Přidal jsem do metody btnLoad_Click

if (!mutex.WaitOne(0, false))
         {
             this.lbStatus.Text = "Již uzamčeno";
             return;
         }

To už funguje zčásti jak se očekává. První instace uzamkne. Druhá nemůže znovu zamknout a úspěšně napíše Již uzamčeno. První instance odemkne. Očekávám že instance č.2 bude moct zamknout - nemůže (již uzamčeno). Narážím tady asi na neznalost Mutexu a synchronizace. Nějaká rada ? Díky moc

Nahoru Odpovědět
9.4.2014 19:14
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:9.4.2014 19:31

Nakonec vyřešeno. Stačilo přidat else a uvolnit mutex

Nahoru Odpovědět
9.4.2014 19:31
Pokrok nezastavíš, neusni a jdi s ním vpřed
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.