Av olika anledningar så behöver vi låsa ett objekt i en tråd mha Monitor.Enter(foo); men sedan låsa upp från en annan tråd, och det funkar ju inte utan smäller med SynchronizationLockException vilket ju är något suboptimalt från vår synvinkel. Eftersom du i alla fall vill kringå det inbyggda låset känns det nästan lättare att implementera en egen låsmetodik som inte kontrollerar att lås/upplås går på samma tråd. njae, i så fall bör man väl använda Semaphore istället för att uppfinna ett eget fyrkantigt hjul.Monitor.Exit från annan tråd
- I normala fall så är trådtillhörigheten en bra sak, så vill helst inte byta till Semaphore
- trådarna i frågan är *inte* UI trådar, så SyncronizationContext.Current är null
- Thread.CurrentContext såg lovande ut men funkade inte det heller
- try/catch runt skiten verkar ju funka, men ser ju inte precis snyggt ut...
<b>Så, hur göra?</b>
ps. lite leksakskod om nån vill testa
Context ctx = Thread.CurrentContext;
Debug.Print("Current tread {0} ctx id {1}",
Thread.CurrentThread.ManagedThreadId, Thread.CurrentContext);
Monitor.Enter(lockObject);
ThreadPool.QueueUserWorkItem(delegate(object dummy)
{
Debug.Print("Pool tread {0} ctx id {1}",
Thread.CurrentThread.ManagedThreadId, Thread.CurrentContext);
ctx.DoCallBack(delegate()
{
Debug.Print("Cross ctx thread {0} ctx id {1}",
Thread.CurrentThread.ManagedThreadId, Thread.CurrentContext);
try
{
Monitor.Exit(lockObject);
}
catch (SynchronizationLockException) { }
});
});
Thread.Sleep(1000);
if (Monitor.TryEnter(lockObject))
{
Debug.Print("success");
Monitor.Exit(lockObject);
}
EDIT: Semaphore skall det vara som inte kollar trådtillhörighet
Sv: Monitor.Exit från annan tråd
Min ogenomtänkta måhända naiva lösning skulle vara att lägga in objektet du vill låsa på i en hash-tabell och ta bort den därifrån när du vill låsa upp. Då skulle du kunna använda ett vanligt lock() runt hash-tabellen när du låser, låser upp och kontrollerar om något är låst.
/johan/Sv:Monitor.Exit från annan tråd