Ich poste diese spezielle Frage nach dem anderen was ich nicht war kann lösen.
Kurz gesagt: Selbst wenn ich eine statische Klasse (mit statischen Variablen und / oder Eigenschaften) erstelle, verwenden die Hauptanwendung und der Hintergrundagent nicht dieselbe statische Klasse, aber beide erstellen eine neue Instanz davon; Es ist also unmöglich, Daten zwischen diesen Projekten zu teilen !!
Um es zu testen:
Verwenden Sie dann diesen grundlegenden Testcode.
AppTest
%Vor%Agent
%Vor%Freigegeben
%Vor% Wenn Sie die Hauptanwendung debuggen, können Sie sehen, dass der statische Konstruktor für die statische Klasse aufgerufen wird (das ist richtig), aber wenn der Agent aufgerufen wird, wird Vars
nicht "verwendet", sondern der Konstruktor wird ein anderes Mal aufgerufen .
Warum? Wie kann ich Daten zwischen Hauptanwendung und Hintergrundagent freigeben?
Ich habe bereits versucht, Vars
class in Agentenklasse und Namespace zu setzen, aber das Verhalten ist das gleiche.
Die Werte von statischen Variablen werden pro geladener App-Domäne "instanziert" eine 'Teilmenge' Ihres laufenden Prozesses. So haben statische Variablen unterschiedliche Werte pro Anwendungsdomäne und daher auch pro laufendem Prozess.
Wenn Sie Daten zwischen Prozessen austauschen müssen, müssen Sie sie entweder irgendwo speichern (z. B. eine Datenbank), oder Sie müssen eine Kommunikation zwischen den Prozessen einrichten (z. B. MSMQ oder WCF).
Hoffe, das hilft.
Am einfachsten ist es, isolierten Speicher zu verwenden. Zum Beispiel von der Haupt-App:
%Vor%und im Agenten:
%Vor%Sie müssen die Synchronisierung auf Prozessebene und Mutex zum Schutz vor Datenbeschädigung verwenden, da der Agent und die Anwendung zwei separate Prozesse sind und gleichzeitig etwas mit isoliertem Speicher ausführen können.
Nach langer Suche fand ich endlich einen Artikel Angabe:
Da unsere EvenTiles-Anwendung und ihre PeriodicTask ausgeführt werden getrennte Prozesse, sie sind vollständig voneinander getrennt, was bedeutet, dass sie ihre eigenen Kopien von Variablen bekommen, die sie beide wollen Zugriff, obwohl diese Variablen in einem separaten Projekt definiert sind.
Es ist also unmöglich, Daten zwischen der Hauptanwendung und periodischen Aufgaben unter Verwendung "einfacher" statischer Variablen / Eigenschaften zu teilen; Wir müssen eine Datenbank lesen oder schreiben oder den isolierten Speicher oder was immer wir wollen.
Ich finde das verrückt, aber das ist die Geschichte.
MS empfiehlt Folgendes:
Das Übergeben von Informationen zwischen den Agenten der Vordergrundanwendung und des Hintergrunds kann eine Herausforderung darstellen, da es nicht möglich ist, vorherzusagen, ob der Agent und die Anwendung gleichzeitig ausgeführt werden. Die folgenden sind empfohlene Muster dafür.
1.Für periodische und ressourcenintensive Agenten: Verwenden Sie LINQ 2 SQL oder eine Datei im isolierten Speicher, die mit einem Mutex geschützt ist. Bei einer einseitigen Kommunikation, bei der die Vordergrundanwendung schreibt und der Agent nur liest, empfehlen wir, eine isolierte Speicherdatei mit einem Mutex zu verwenden. Es wird empfohlen, keine IsolatedStorageSettings für die Kommunikation zwischen Prozessen zu verwenden, da die Daten dadurch beschädigt werden können.
2.Für Audio-Agenten: Speichern Sie benutzerdefinierte Daten in der Tag-Eigenschaft der AudioTrack-Klasse. Für Benachrichtigungen vom Audio-Agent an die Vordergrundanwendung lesen Sie die Tag-Eigenschaft im PlayStateChanged-Ereignishandler. Um Daten von der Vordergrundanwendung an den Audio-Agent zu übergeben, lesen Sie die Tag-Eigenschaft der aktuellen Spur in der Implementierung der Methode OnPlayStateChanged (BackgroundAudioPlayer, AudioTrack, PlayState).
Siehe hier: Ссылка
Tags und Links c# windows-phone-7