[ Belgarion @ 12.02.2014. 08:59 ] @
Code:
            private static object syncLock = new object();
            lock (syncLock)
            {
                    if (!IsSent())
                    {
                         SendEmails();
                     }
            }


Treba da se samo jednom pozove funkcija SendEmails(), od strane bilo kog thread-a.
Ono što mi treba je da ako je neko ušao u syncLock, da svi posle ne čekaju da se syncLock odključa, nego da preskoče čitav syncLock.
Problem je u tome što ako se SendEmails() funkcija dugo izvršava onda onaj koji čeka na syncLock-u dobije time out exception, a zapravo nema ni potrebe da čeka.

[ Belgarion @ 12.02.2014. 10:18 ] @
Nasao sam!

Code:

using System.Threading;
...
private static object syncLock = new object();
if (Monitor.TryEnter(syncLock))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(syncLock);
    }
}

http://stackoverflow.com/quest...ip-if-timed-out-operation-in-c
[ ravni @ 12.02.2014. 12:43 ] @
Citat:
Belgarion:Treba da se samo jednom pozove funkcija SendEmails(), od strane bilo kog thread-a.
Problem je bio sto si previse stavio u lock. Bolje bi bilo
Code:
private static object syncLock = new object();
static bool sendCalled;

static void SomeMethod()
{
  lock (syncLock)
  {
    if(sendCalled)
      return;

    sendCalled = true;
  }
 
  SendEmails();
}

[ mmix @ 12.02.2014. 12:48 ] @
Citat:
ravni: Problem je bio sto si previse stavio u lock. Bolje bi bilo
Code:
private static object syncLock = new object();
static bool sendCalled;

static void SomeMethod()
{
  lock (syncLock)
  {
    if(sendCalled)
      return;

    sendCalled = true;
  }
 
  SendEmails();
}


Nije ti dobar kod. Ako dva threadu u isto vreme budu u tacki iza if (a moguce je), oba ce proci. Ovo su najgori bagovi
[ Burgos @ 12.02.2014. 13:15 ] @
Kako je moguće da više niti bude iza lock sekcije? Verovatno ja ne vidim dobro, ali mi se čini da samo prva nit koja uđe u lock će da postavi sendCalled na true, i sve ostale niti će iz lock sekcije izlaziti return naredbom. Možda nedostaje volatile kod sendCalled polja?
[ mmix @ 12.02.2014. 13:53 ] @
a da, u pravu si, promakao mi je taj deo. Izvinjavam se na trolovanju.
[ Burgos @ 12.02.2014. 14:00 ] @
Nije trolovanje, analize ovakvih stvari nikad dosta! da je bar ceo es ovakav :-)
[ Belgarion @ 12.02.2014. 14:16 ] @
Citat:


static bool sendCalled;

static void SomeMethod()
{
lock (syncLock)
{
if(sendCalled)
return;

sendCalled = true;
}

SendEmails();
}
[/code]


Kako ovo radi?
sendCalled promenljiva se deklarise, i posle toga se proverava na if-u.
A nigde izmedju toga se ne postavlja ni na true ni na false???

[ Burgos @ 12.02.2014. 15:03 ] @
U C#, podrazumevana inicijalizacija postavlja polja klase tipa bool na false.

http://msdn.microsoft.com/en-us/library/aa645756(v=vs.71).aspx
[ AMD guy @ 12.02.2014. 17:05 ] @
Podrazumevana inicijalizacija vazi samo za value types tipa bool ili int, ali ne vazi za referentne tipove kao sto je string ili object.
[ Burgos @ 12.02.2014. 17:53 ] @
Važi, samo je podrazumevana vrednost referentnih tipova null.

http://msdn.microsoft.com/en-us/library/aa691171(v=vs.71).aspx
[ AMD guy @ 12.02.2014. 18:06 ] @
Tacno ali ces za null referentne vrednosti dobiti NullReferenceException, dok to ne vazi za vrednosne tipove.
[ mmix @ 12.02.2014. 18:36 ] @
Inicijalizacija polja je samo posledica nacina na koji .NET alocira memoriju i sistema zastite memorije od neovlascenog citanja. Nakon alociranja data bloka za objekat, ceo blok se prepisuje nulama. Tako da sva polja dobijaju vrednost koja ej ekvivalentna njihovoj binarnoj reprezentaciji 0. Ne postoji skriveni kod koji za svako polje uradi polje = 0 tj referenca = null;