2009-06-24 15 views
11

Bazı programcıların bazı donanımları denetlemesi için kullanacak özel bir .net donanım çerçevesi oluşturuyorum. Donanım çerçevemize ulaşmak için DLL'imize bir referans ekleyecektir. Birden çok uygulamadan (süreçler) erişilebilecek bir paylaşılan sınıfa ihtiyacım var.Bir DLL içindeki bir Singleton Sınıfı işlemler arasında paylaşılabilir mi?

Tekil kalıbı ihtiyacım olan şey gibi görünüyor, ancak yalnızca işleminiz içinde birden fazla iş parçacığı için çalışıyor. Tamamen yanlış olabilirdim ama burada şu an sahip olduğum C# kodunun bir örneği var. Tasarımın yanlış olduğunu hissetmemde yardımcı olamam. Daha spesifik bilgileri paylaşabilmeyi isterdim ama yapamam.

  • Müşteri uygulaması üzerinde hiçbir kontrolüm olmayacağını vurgulamalıyım. Çözüm, çerçevenin (DLL) içinde yer almalıdır.

Çerçevesi: (Paylaşılan DLL)

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

Testi Uygulaması:

: (sonunda müşteri uygulaması)

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

ilk başlatılan uygulama bir çıkış verir

Kaynağı yakalamak için enter'a basın!

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

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

basın sürecini kapatmak için girmek!

basın kaynağını yakalamak için girin:

ikinci uygulama bir çıkış verir!

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

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

basın sürecini kapatmak için girmek!

Sonuç:

ben hem uygulama sınıfının ilk örnekleme zamanı aynı dizesini döndürür görmek istiyorum.

İşlemdeki birden çok iş parçacığı için tekli işlemlerini görebileceğiniz gibi çapraz işlemleri göremiyorsunuz. Belki bu yapılamaz çünkü herhangi bir çözüm bulamıyorum.

+0

Çözerim vurgulamak gerekir ...

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

Özellikle çapraz süreç senkronizasyonu burada inşa bkz parçacığı üzerinde çevrimiçi ücretsiz e-kitap okumak Müşteri uygulaması üzerinde kontrol sahibi olmayın. Çözüm, çerçevenin (DLL) içinde yer almalıdır. –

cevap

2

Uygulamalarda eşitlemek için tekil kullanamazsınız. Her biri kendi uygulama alanında çalışır ve güvenlik nedeniyle bellek/nesneler/etc'ye erişemez. diğerinden iletişim metodu olmadan (uzaktan kumanda gibi) ikisini senkronize etmek için üçüncü bir programa geçmeleri gerekiyordu.

+0

Aynı soru vardı, ama bir alternatif olarak, bu tekton örneğini GAC'ye yerleştiremiyorum ve her iki süreç de bu örneğe başvurabilir mi? Bu şekilde, nesneyi bir işlemden güncelleştirirseniz, diğer işlemin güncellenmiş örneği almasını istemez misiniz? VEYA her işlem vakayı kendi işlemine mi yükler? – hangar18

+0

@ hangar18 tam olarak aynı soru - GAC yerleştirerek özel bir şey yok, hala bir dll! – markmnl

7

Evet, çeşitli işlemler arasında tekil paylaşmak mümkün. Ancak, bu sonucu elde etmek için süreçler arası iletişimi destekleyen bir teknolojiden faydalanmanız gerekecektir.

Nesnenizi doğrudan doğruya paylaşmanızı sağlayan en popüler teknolojiler, Remoting ve WCF'dir.

Tek birtonu bunlardan biriyle paylaşmak için bir örnek vermek bir SO cevabının kapsamı dışındadır. Ancak, bunların her biri için web'de birçok öğretici var. Googling teknolojisi ya da singleton sizi doğru yola koymalı.

2

Kevin'in cevabına eklemek için, sınıfınız için yapıcınız gerçekten gerçek bir singleton olması için özel olarak yapılmalıdır, aksi takdirde hiçbir şey kurucu aracılığıyla Kaynaklar sınıfının yeni bir örneğini oluşturmaya engel olmaz. Bu senin problemini çözmüyor, ama Singleton'u kötüye kullanmaktan vazgeçiyor.

+0

Yapıcının özel olması konusunda haklısınız. Numuneyi tamir ettim. –

+0

Bu sadece bir örnektir. Bir tarihi paylaşmaya çalışmıyorum. Bir donanım kaynağını kontrol etmeye çalışıyorum. –

+0

Bu durumda bir dosya iyi olmayacak. Benim hatam. – AlbertoPL

1

İki farklı işlemden farklı bir derlemede bir singleton özelliğini çağırmak, o sınıfın farklı örneklerini oluşturacaktır.

Ancak, yalnızca basit bir sinyale (EventWaitHandle) gereksinim duyuyorsanız, .Net Remoting veya süreçler arası işlem olayları arasındaki bilgileri kolayca paylaşabilirsiniz.

[Düzenleme:] Remoting a tek örneğini kullanan dahili bir sınıf maruz bırakabilir, arayanların bir Singleton gibi görünmesi ve daha sonra şeffaf örneğini döndürmek için. İşte (bence) bu bir örnek: http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx