Teilen Sie Daten zwischen Hauptanwendung und periodischer Aufgabe

8

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:

  • Erstellen Sie eine neue Windows Phone-Anwendung ( AppTest )
  • Fügen Sie ein ScheduledTask-Projekt hinzu ( Agent )
  • Geben Sie in AppTest einen Verweis auf das Projekt Agent ein
  • Erstellen Sie ein neues Windows Phone-Bibliotheksprojekt ( Freigegeben )
  • Sowohl in AppTest als auch in Agent wird ein Verweis auf das Projekt Freigegeben eingefügt

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.

    
Marco 09.07.2012, 06:33
quelle

4 Antworten

5

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.

    
Maarten 09.07.2012, 06:40
quelle
8

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.

    
Peter Ritchie 10.07.2012 18:35
quelle
3

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.

    
Marco 09.07.2012 07:46
quelle
2

MS empfiehlt Folgendes:

Kommunikation zwischen Vordergrundanwendung und Hintergrundagent

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: Ссылка

    
Mark Sowul 26.08.2012 10:56
quelle

Tags und Links