Pergunta

Estou criando um quadro hardware .net personalizado que será usado por outros programadores para controlar algum hardware. Eles irão adicionar uma referência ao nosso DLL para chegar ao nosso quadro de hardware. Estou precisando de uma classe compartilhada que será acessado a partir de múltiplas aplicações (processos).

O padrão Singleton parece ser o que eu preciso, mas ele só funciona para vários segmentos dentro do seu processo. Eu poderia estar completamente errado, mas aqui está um exemplo do código C # Eu tenho atualmente. Não posso deixar de sentir que o projeto está incorreto. Eu gostaria de poder compartilhar mais informações específicas, mas eu não posso.

  • Devo salientar que eu vou ter nenhum controle sobre a aplicação do cliente. A solução deve ser contido dentro do quadro (DLL) em si.

O quadro: (DLL compartilhada)

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;
        }
    }
} 

O aplicativo de teste: (finalmente aplicativo cliente)

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);
    }
}

O aplicativo lançado pela primeira vez dá uma potência de:

Pressione Enter para capturar o recurso!

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

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

pressione Enter para fechar o processo!

A segunda aplicação dá uma potência de:

Pressione Enter para capturar o recurso!

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

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

pressione Enter para fechar o processo!

Conclusão :

Eu gostaria de ver ambas as aplicações retornar a mesma seqüência do momento da primeira instanciação da classe.

Como você pode ver as obras únicas para o segmento de múltiplos dentro do processo, mas não os processos transversais. Talvez isso não pode ser feito porque não consigo encontrar qualquer solução.

Foi útil?

Solução

Você não pode usar um singleton para sincronia entre aplicações. Cada executado em seu próprio espaço de aplicação, e como uma questão de segurança não pode memória de acesso / objetos / etc. do outro, sem um método de comunicação (como a comunicação remota) Para sincronizar os dois teriam que remota em um terceiro programa.

Outras dicas

Sim, é possível compartilhar um singleton entre vários processos. No entanto, você vai precisar para tirar proveito de uma tecnologia que suporta a comunicação entre processos, a fim de alcançar este resultado.

As tecnologias mais populares que lhe permitem compartilhar o seu objeto bastante directamente são Remoting e WCF.

Dando um exemplo de partilha de um singleton com qualquer um destes está fora do âmbito de uma resposta SO. Mas existem muitos tutoriais na web para cada um deles. Googling qualquer tecnologia além de Singleton deve colocá-lo no caminho certo.

Para adicionar a resposta do Kevin, seu construtor para seus recursos de classe deve realmente ser feita privada para que seja um verdadeiro singleton, caso contrário, nada é parar alguém de criação de uma nova instância da classe Recursos através do construtor. Isso não resolve o problema, mas ele faz parar um de mau uso do Singleton.

Simplesmente chamar uma propriedade singleton em um conjunto diferente de dois processos diferentes irá criar diferentes instâncias dessa classe.

Mas você pode facilmente compartilhar informações entre processos utilizando .Net Remoting ou eventos entre processos fogo se você só precisa de sinalização simples ( EventWaitHandle ).

[Edit:] Para fazer com que pareça um Singleton para o seu interlocutor, você pode expor uma classe que vai usar internamente Remoting instanciar um singleton, e, em seguida, retornar a instância de forma transparente. Aqui está um exemplo que (eu acho) que isso: http: //www.codeproject. com / KB / dotnet / remotingsingleton.aspx

Existem maneiras de fazer isso, como mencionado acima. Mas é desajeitado, se você usar WCF ou comunicação remota. Por favor, tente técnicas de fio de sincronização entre processos.

Para obter mais informações, leia o livre e-book on-line no enfiamento

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

Especialmente ver as construções processo de sincronização transversais aqui ...

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top