Hej, Jag har hittat och testat AutoResetEvent() vilket verkar fungera på samma sätt som en vanlig monitor, iaf så vitt jag uppfattat det... C# Compact Framework - Monitor och Wait: Går det att göra?
sitter o är förtvivlad över att inga fina Monitor-klasser finns i Compact Framework (v 1.1). Testade OpenNETCF:s MonitorEx-klass men den verkar strula också som jag ska beskriva.
Mitt problem är egentligen att jag vill ha en Wait()-metod som alltid låsen en tråd tills dess att en Pulse/PulseAll har gjorts - precis som vanliga Monitorer fungerar i .NET 1.1 (Full Framework).
Varken Monitor.Wait() eller Monitor.Pulse/PulseAll() existerar i CF, utan endast Monitor.Enter() och Monitor.Exit().
Problemet är att dessa inte låser någonting. Det första som kommer hända i mitt program (ganska standard i realtidsprogrammering) är att en viss tråd kommer vilja hämta någon viss information, och kommer blockas/låsas tills information finns att hämta.
Tråden kör följande:
<code>
private void run()
{
DataUnit messageUnit = null;
byte[] byteData = null;
while(true)
{
messageUnit = dataBuffer.getSAMData();
// Do something
}
}
</code>
Metoden getSAMData() ser då ut som följer:
<code>
public DataUnit getSAMData()
{
lock(samLock)
{
while(samData.Count < 1)
{
Monitor.Wait(samLock);
}
DataUnit temp = (DataUnit) samData[0];
samData.RemoveAt(0);
return temp;
}
}
</code>
En väldigt enkel och rak Monitor helt enkelt. Problemet i CF är alltså att låsa en tråd, som Wait() ovan.
Jag har tittat lite på Semaphorer och Mutex men får inte riktigt ihop det hur man bygger sin egen Wait(). Problemen ligger också lite i att de som gör en Mutex.WaitOne() kommer direkt att få "ownership" och så går det vidare - den låses inte. Så då måste någon annan ta en WaitOne() först, INNAN denna tråden kan göra det. Men då måste den även releasa vid något tillfälle och det blir en jäkla sörja av allt.
Några tips och ideér?
MVHSv: C# Compact Framework - Monitor och Wait: Går det att göra?
Hmm, någon skillnad måste väl finnas...