I have some test code below that illustrates how the TryEnter and Exit
work together. I have not seen or experienced the behavior you have
explained. It sounds almost like you are not calling Monitor.Exit from
thread A and thread B is timing out.
To use the code below, create a new console application project, copy the
code into the default console application class file while replacing the
existing class it generates. The way the code stands right now, thread 1
will block thread 2 since their ThreadStart methods both call TestLock()
with the same object and Thread 2 will then do it's work once Thread 1
releases the lock. If you want to see Thread 2 time out, increase the
sleepTimeout to exceed the tryEnterTimeout. If you want to see thread 1
and thread 2 run in parallel, have the Test2 method call TestLock with
obj2.
public class ThreadTest {
private const int tryEnterTimeout = 10000;
private const int sleepTimeout = 9000;
private object obj1 = 1;
private object obj2 = 1;
private void DisplayMessage(string test, string message)
{
Console.WriteLine(test + " - " + message + " - " +
DateTime.Now.ToString());
}
private void TestLock(string test, object lockObject)
{
bool aquiredLock = false;
try
{
aquiredLock = Monitor.TryEnter(lockObject,
tryEnterTimeout);
if (aquiredLock)
{
DisplayMessage(test, "Aquired Lock");
Thread.Sleep(sleepTimeout);
DisplayMessage(test, "After Sleep");
}
else
{
DisplayMessage(test, "Time Out");
}
}
finally
{
if (aquiredLock)
{
Monitor.Exit(lockObject);
DisplayMessage(test, "Released Lock");
}
}
}
public void Test1() {
TestLock("Test1", obj1);
DisplayMessage("Test1", "Complete");
}
public void Test2() {
TestLock("Test2", obj1);
DisplayMessage("Test2", "Complete");
}
}
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
ThreadTest threadTest = new ThreadTest();
Thread t1 = new Thread(new ThreadStart(threadTest.Test1));
Thread t2 = new Thread(new ThreadStart(threadTest.Test2));
t1.Start();
t2.Start();
Console.ReadLine();
}
}
Chad
On Wed, 16 Jul 2003 18:38:46 +0100, TIAGO PASCOAL (Interaction)
<[EMAIL PROTECTED]> wrote:
> I'm using Monitor.TryEnter(object,int millisecondsTimeout) overload to
wait
>for a lock for no more than X amount of time. Now I'm getting a strange
>behaviour.
>
>From what I understand from the specification using this overload I would
>get the same behaviour as using the lock keyword (C#) but on wait no more
>than millisecondsTimeout.
>
>What I'm getting is the lock is ONLY obtained after millisecondsTimeout
>elapses EVEN when the lock has been released.
>
>Going to try to make graphic representation of a timeline
> x Seconds 120 seconds
>(after)
>-------+--------+-------+--------+-------+--------+-------+--------+
>
>Thread A TryEnter(obj,120000) LOCK_RELEASED
>Thread B TryEnter(obj,120000); Thread B
>unblocks
>
>Thread A gets hold of the lock first and Thread B blocks.
>
>Thread B should unblock on x Seconds and only unblocks after 120 seconds.
>
>If I replace TryEnter with lock(obj) thread B unblocks right after thread
A
>has
>Released the lock.
>
>Any thoughts?
>
>TIA
>
>
>
>
>--
>Regard your good name as the richest jewel you can possibly be possessed
of
>- for credit is like fire;
>when once you have kindled it you may easily preserve it, but if you once
>extinguish it, you will find
>it an arduous task to rekindle it again. The way to gain a good reputation
>is to endeavor to be what you desire to appear."
> [Socrates]
>
>
>**************************************************************************
**
>
>
>Esta mensagem (incluindo eventuais ficheiros anexos) pode conter
informacao
>confidencial ou privilegiada.
>Se nao for o destinatario pretendido, por favor contacte imediatamente o
>remetente por e-mail, e apague a mensagem do seu sistema informatico.
>A transmissao de mensagens por e-mail nao e absolutamente segura ou livre
de
>erro: a mensagem pode ser interceptada, alterada, perdida, destruida,
chegar
>ao seu destinatario num momento posterior ao pretendido ou alterada, ou
>ainda com virus. O Banco Espirito Santo declina qualquer responsabilidade
>por erros ou omissoes na presente mensagem que resultem das circunstancias
>descritas.
>Qualquer opiniao expressa na presente mensagem e imputavel a pessoa que a
>enviou, a nao ser que o contrario resulte expressamente do seu texto e
que a
>pessoa em causa tenha poderes para vincular o Banco Espirito Santo.
>
>This message and any files transmitted with it may contain confidential
>information or privileged material.
>If you are not the intended recipient, please notify the sender
immediately
>by e-mail and delete this message from your system.
>E-mail transmission cannot be guaranteed to be secure or error-free as
>information could be intercepted, corrupted, lost, destroyed, arrive late
or
>incomplete, or contain viruses. Banco Espirito Santo therefore does not
>accept liability for any errors or omissions in the contents of this
message
>which arise as a result of e-mail transmission.
>Any views expressed in this message are those of the individual sender,
>except where the message states otherwise and the sender is authorized to
>state them to be the views of Banco Espirito Santo.
>
>**************************************************************************
**