Domanda

Sto creando un framework hardware .net personalizzato che verrà utilizzato da altri programmatori per controllare alcuni componenti hardware. Aggiungeranno un riferimento alla nostra DLL per accedere al nostro framework hardware. Ho bisogno di una classe condivisa a cui si accederà da più applicazioni (processi).

Il modello singleton sembra essere quello di cui ho bisogno, ma funziona solo per più thread all'interno del tuo processo. Potrei sbagliarmi completamente, ma ecco un esempio del codice C # che ho attualmente. Non posso fare a meno di pensare che il design non sia corretto. Vorrei poter condividere informazioni più specifiche ma non posso.

  • Devo sottolineare che non avrò alcun controllo sull'applicazione del cliente. La soluzione deve essere contenuta all'interno del framework (DLL) stesso.

Il framework: (DLL condivisa)

public class Resources
{
    static readonly Resources m_instance = new Resources();

    public string Data;

    private Resources()
    {
        Data = DateTime.Now.ToString();
    }

    public static Resources Instance
    {
        get
        {
            return m_instance;
        }
    }
} 

L'applicazione di test: (eventualmente l'app per i clienti)

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Press enter to capture the resource!");
        Console.ReadLine();

        var resources = Resources.Instance;
        Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data);

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += WorkerDoWork;
        worker.RunWorkerAsync();

        while (worker.IsBusy)
        {
            Thread.Sleep(100);
        }

        Console.WriteLine("Press enter to close the process!");
        Console.ReadLine();
    }

    static void WorkerDoWork(object sender, DoWorkEventArgs e)
    {
        var resources = Resources.Instance;
        Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data);
    }
}

La prima applicazione avviata fornisce un output di:

  

Premi Invio per acquisire la risorsa!

     

1: 24/06/2009 8:27:34

     

3: 24/06/2009 8:27:34

     

Premi Invio per chiudere il processo!

La seconda applicazione fornisce un output di:

  

Premi Invio per acquisire la risorsa!

     

9: 24/06/2009 8:27:35

     

10: 24/06/2009 8:27:35

     

Premi Invio per chiudere il processo!

Conclusione :

Vorrei che entrambe le applicazioni restituissero la stessa stringa del tempo della prima istanza della classe.

Come puoi vedere, il singleton funziona per il thread multiplo all'interno del processo ma non per i processi incrociati. Forse questo non può essere fatto perché non riesco a trovare alcuna soluzione.

È stato utile?

Soluzione

Non è possibile utilizzare un singleton per la sincronizzazione tra applicazioni. Ognuno viene eseguito nel proprio spazio applicativo e per motivi di sicurezza non è possibile accedere alla memoria / oggetti / ecc. dall'altro senza un metodo di comunicazione (come il remoting) Per sincronizzare i due dovrebbero passare in remoto a un terzo programma.

Altri suggerimenti

Sì, è possibile condividere un singleton tra diversi processi. Tuttavia, per ottenere questo risultato dovrai sfruttare una tecnologia che supporta la comunicazione tra processi.

Le tecnologie più popolari che ti consentono di condividere il tuo oggetto in modo abbastanza diretto sono Remoting e WCF.

Dare un esempio di condivisione di un singleton con uno di questi va oltre lo scopo di una risposta SO. Ma ci sono molti tutorial sul web per ognuno di questi. Google o la tecnologia più singleton dovrebbero metterti sulla strada giusta.

Per aggiungere alla risposta di Kevin, il tuo costruttore per la tua classe Risorse dovrebbe davvero essere reso privato perché sia ??un vero singleton, altrimenti nulla impedisce a qualcuno di creare una nuova istanza della classe Risorse attraverso il costruttore. Questo non risolve il tuo problema, ma impedisce di abusare del Singleton.

Il semplice richiamo di una proprietà singleton in un assembly diverso da due processi diversi crea istanze diverse di quella classe.

Ma puoi facilmente condividere le informazioni tra i processi usando .Net Remoting o attiva eventi tra processi se hai bisogno solo di una segnalazione semplice ( EventWaitHandle ).

[Modifica:] Per farlo sembrare un Singleton per i tuoi chiamanti, puoi esporre una classe che utilizzerà internamente Remoting per creare un'istanza di un singleton e quindi restituire l'istanza in modo trasparente. Ecco un esempio che (penso) lo fa: http: //www.codeproject. com / KB / dotnet / remotingsingleton.aspx

Ci sono modi per farlo come menzionato sopra. Ma è goffo se si utilizza WCF o da remoto. Prova le tecniche di sincronizzazione dei thread tra processi.

Per maggiori informazioni leggi l'e-book gratuito online sul threading

http://www.albahari.com/threading/

Vedi in particolare i costrutti di sincronizzazione del processo incrociato qui ...

http://www.albahari.com/threading/part2.aspx#_Synchronization_Essentials

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top