zur Erweiterung einer Anwendung um ein Benachrichtigungssystem habe ich eine allgemeine Klassenbibliothek ausprogrammiert. Nach dem ich alles durchprogrammiert hatte, habe ich zum Test eine Windows Forms Anwendung erstellt, die auf die Funktionalitäten der Bibliothek zugreift und diese nutzt.
Alles funktionierte einwandfrei. Anschließend habe ich eine Bibliothek mit den selben Code-Dateien für das Compact-Framework erstellt, da die Verweise auf Framework Assemblies dort anders sind.
Erstaunt musste ich jedoch feststellen, dass sich die Anwendung ganz anders verhält als erwartet und der boolsche Wert nur dem entspricht, was innerhalb des Threads gesetzt wurde.
Hier hab ich dann auf das volatile Keyword zurückgegriffen, da es ja meines Wissens nach genau für den Fall dass aus mehreren Threads gesetzt werden soll da ist.
Aber dies brachte keinen Erfolg.
Anschließend habe ich den Verweis in meiner Testanwendung entfernt und die CF Bibliothek dort eingebunden. Und wieder war ich verblüfft, in der Windows Forms Anwendung kam es damit zu den genau richtigen Ergebnissen.
Was muss ich nun aber im Compact-Framework tun?!
Abgespeckt sieht mein Code in der entsprechenden Klasse wie folgt aus:
public class Notifier
{
private volatile bool _bNotificationVisible = false;
private Notification _currentNotification == null;
public void Start() { /* some code */ }
public void Stop() { /* some code */ }
public void Deny()
{
/ * some code to deny */
_bNotificationVisible = false;
}
public void Accept()
{
/* some code to accept */
_bNotificationVisible = false;
}
///
// The thread method ... runs all the time
private void DoWork()
{
do
{
// get notifications
// remove old notifications
// add new notifications
if(!_bNotificationVisible && /* some properties of Notification are true */)
{
/ * code for show next notification
an event will be thrown...
*/
_bNotificationVisible = true;
}
Thread.Sleep(/* some duration */);
}while(_workerThread == Thread.CurrentThread);
}
}
Aus oben dargestelltem müsste ersichtlich sein, wie das ganze vom Prinzip her funktionieren soll.
Nun habe ich aber folgendes Problem:
Wird eine Meldung angezeigt und anschließend die Accept Methode aufgerufen, wird wie auch gewünscht unter .NET sowie .NET compact _bNotificationVisible auf false gesetzt. Innerhalb des Threads wird dies anschließend auch als false gehandlet und die nächste Meldung ausgegeben.
Die Methode Deny liefert allerdings ein ganz anderes Ergebnis, unter dem großen Framework wird wie auch erwartet _bNotificationVisible auf false gesetzt und anschließend die nachfolgende Meldung ausgegeben.
Unterm Compact Framework allerdings wird _bNotificationVisible zuerst innerhalb der Methode auf false gesetzt, im nächsten Durchlauf der Threadmethode allerdings ist der Wert wieder true, wird allerdings nur an der einen Stelle auf true gesetzt die zwischenzeitlich nicht erreicht wurde.
Ich hoffe ihr könnt mir denkanstöße geben, woran dies liegen könnte. Wahrscheinlich ist es so trivial, dass ich meinen Kopf dannach als Hammer zum Nägel in die Wand klopfen nehmen sollte.