Hej! Ett tips är att kolla in OpenNETCF's bibliotek. Det implementerar mycket av det som man saknar i Compact Framework. Jo, har tittat lite på OpenNETCF:s grejor och även om de har en del schyssta saker kommer det inte hjälpa speciellt mycket i detta fall (tror jag iaf). Microsoft tycker inte att program ska stängas av i Windows Mobile...C# Compact Framework: Avsluta program/trådar
Är det någon som har bra koll på C# Compact Framework 1.1, och hur man hanterar trådar på ett bra sätt? Mitt stora problem är att avsluta en applikation som innehåller flertalet trådar.
Jag har lyckats en gång då jag ganska så maneullt avslutade trådar genom att kalla "close()"-metoder på dem som jag skrivit själv. Denna close-metod var/är enkel - sätter en bool till false (så att tråden ska gå ur sin while-loop). Så långt är det OK, men det finns andra problem:
Många tråda ligger och väntar på att något ska hända, i Monitorer. Dessa Monitorer använder sig av AutoResetEvent-klassen för att vänta (AutoResetEvetn.WaitOne() respektive AutoResetEvent.Set()). När trådarna är låsta i WaitOne() spelar det ingen roll om jag sätter en bool = false; då den inte tittar på det utan väntar på något.
Vad jag har försökt då med är att köra en close()-metod i Monitorn också som kör en AutoResetEvent.Set() (för att säga "något har hänt"). Tråden som då ligger låst i WaitOne() vaknar till o kollar läget. Därefter kan tråden se att bool variablen är satt till false och avsluta.
Teoretisk ska detta fungera, men blir oerhört kladdig kod och fungerar inte heller alltid (som t ex nu när jag skrivier om programmet en aning).
Vad jag undrar är ifall någon har en bra lösning på hur man hanterar denna problematiken! Observera att det är under Compact Framework jag letar en lösning, inte vanliga .NET 1.1.
Tack!
Lite kodexempel:
Här är en Monitor som har en metod som heter getData(). En tråd kommer att köra den metoden och fastna i "monitor.WaitOne()". Under den finns close()-metoden för Monitorn enligt beskrivningen ovan. Tanken är då att tråden vaknar, ser att cont == false (och går INTE in och låser sig igen med andra ord), returnerar nåt strunt.
<code>
public BufferObject getData()
{
while (buffer.Count == 0 && cont)
{
monitor.WaitOne();
}
BufferObject bo;
if (cont)
{
bo = (BufferObject) buffer[0];
buffer.RemoveAt(0);
System.Diagnostics.Debug.WriteLine(" CFNetworkingClient::DataBuffer> getData(): Getting frmStart-data!");
}
else
{
bo = new BufferObject(0, new byte[0]);
}
return bo;
}
public void close()
{
cont = false;
monitor.Set();
}
</code>
Här är den run()-metod som tråden kör i. Den statiska variablen _continue i FrmStart har blivit satt till false, och således när Tråden vaknat till enligt ovan, gör det något, kommer tillbaka till while-satsen och ser att _continue = false, och ska då gå ur while-satsen och dö.
<code>
public void run()
{
BufferObject sipMessage;
DataUnit unit;
while(FrmStart._continue)
{
sipMessage = inputBuffer.getData();
//tConsole.WriteLine("SIPPopper> Data received from DataBuffer!");
// och så vidare ...
</code>
Tanker, ideér, lösningar???
MVHSv: C# Compact Framework: Avsluta program/trådar
Vet att de bl.a. har ett utökat Thread-stöd.
Såg dock i ett annat inlägg att du redan testat lite med det.Sv:C# Compact Framework: Avsluta program/trådar
Vad jag tycker är konstigt är att jag hittar INGET på nätet (har googlat som en galning) gällande just Monitor-problemen, speciellt för CF. Hur löser man det faktum att trådar låser sig i en Monitor som ovan beskrivet, om man vill avsluta ett program eller helt enkelt bara ta bort alla trådar och monitorer för att t.ex. göra en ny uppkoppling?
Det måste ju vara en riktigt typiskt standard-grej inom programmering och borde således finnas en enkel lösning på det. Men jag vet inte.
De kodexempel som jag gav ovan är riktigt fula tycker jag. Att signalera monitorn med .Set() trots att det inte finns data att hämta och dessförinnan sätta en bool variabel till "false" så att man inte ska leta efter data är primitivt och ett fulhack. Men jag vet inget annat sätt att få loss tråden som ligger o väntar.
???Sv: C# Compact Framework: Avsluta program/trådar
Thread.IsBackground tillåter att man stänger programmet utan att avsluta trådar. Stödjs i CF 2.0.
/andrec