2016-05-04 10 views
0

Ich habe ein Problem und erst vor kurzem festgestellt, dass die Ursache (war die Fehlersuche ein Symptom bis jetzt). Im Grunde habe ich eine Lösung, die ein WPF-Anwendungsprojekt (den Start), eine Gruppe von Assemblys (Model, ModelView usw.) und ein Word-VSTO-Add-In hat. Das ViewModel und das Word-Add-In bilden eines der Modelle, die ich für diese Entwicklungsstufe zu einem Singleton gemacht habe.C# Singleton ausgesetzt MS Word Interop-Add-in

Das Ansichtsmodell instanziiert das Modell in seinem Konstruktor

ModelSingleton mod = ModelSingleton.Instance; 

Das Addin tut dasselbe auf ThisAddIn_Startup() Methode verwendet.

Modellcode:

private static volatile ModelSingleton instance; 
private static object syncRoot = new Object(); 

private ModelSingleton() 
{ 
} 

public static ModelSingleton Instance 
{ 
    get 
    { 
     lock (syncRoot) 
     { 
      if (instance == null) 
      { 
       instance = new ModelSingleton(); 
      } 
     } 
     return instance; 
    } 
} 

Ich mag das Wort Addin markierten Text zu erfassen und zu meinem Modell übergibt, die dann ihre eigene Ereignis erzeugt, dass das Viewmodel ist substrierten.

Mein Problem ist, dass sowohl das Addin als auch das Viewmodel separate Instanzen von etwas erstellen, das ein Singleton sein soll. Der markierte Text wird an einen Singleton übergeben, es wird jedoch kein Ereignis generiert, da das ViewModel das Ereignis in einer anderen Instanz abonniert hat.

Ich bin ein Neuling für Interop und COM; Ich würde erwarten, dass ein Singleton nur einmal instanziiert wird. Gibt es zwei getrennte Laufzeiten oder etwas, das hier vor sich geht (anscheinend sind die VSTO und die WPF beides ausführbare Dateien, was bedeutet, dass sie Daten nicht direkt teilen können)? Wie mache ich den Singleton zu einem echten Singleton? Und wenn das nicht möglich ist, wie würden Sie markierten Text (und Metadaten) von MS Word an Ihre proprietäre App weitergeben?

Antwort

0

Ich glaube, Sie versuchen, dies zu tun:

public static ModelSingleton Instance 
{ 
    private static ModelSingleton instance = null; 
    private static readonly object syncRoot = new Object(); 

    private ModelSingleton() 
    { 
    } 
    get 
    { 
     lock (syncRoot) 
     { 
      if (instance == null) 
      { 
       instance = new ModelSingleton(); 
      } 
     } 
    return instance; 
    } 
} 

dies wird Ihnen Sicherheitsfaden geben ohne Deadlocks

+1

Sorry, wenn es war unklar, aber vorstellen, "public class ModelSingleton { }" eingewickelt um den obigen Code herum – Moe45673