2015-07-22 23 views
5

Oturum açma, Barkod ve Ana olmak üzere 3 sınıfa sahibim.
Giriş sınıfı sadece kullanıcıların kimlik doğrulamasını içerir.Etkinlik aboneliğinin çoğaltılması nasıl önlenir?

class Barcode 
    { 
     public delegate void BarcodeReadHandler(object sender, BarcodeEventArgs e); 
     public event BarcodeReadHandler BarcodeReadOut; 

     public Barcode() 
     { 
     //.. some codes for getting data on the scanner 
     BarcodeEventArgs args = new BarcodeEventArgs(scannedData); 
     BarcodeReadOut(this, args); 
     } 

    } 

Ana sınıfında, Barkod olayın aboneliğinizi, yapılırken: Ben çıkış deneyin ve ne zaman

public partial class Main : Form 
    { 
     private Barcode barcode = null; 

     public Main() 
     { 
     barcode.BarcodeReadOut += new barcode.BarcodeReadHandler(getBarcodeStr); 
     } 

     //This is called before log-out. 
     public void removeInstance() 
     { 
     barcode.BarcodeReadOut -= new barcode.BarcodeReadHandler(getBarcodeStr); 
     } 

     private void getBarcodeStr(object sender, BarcodeEventArgs e) 
     { 
     //some code 
     } 

    } 

olay abonelik çoğaltılması olur
Barkod sınıfı aşağıdaki pasajı kodu vardır Tekrar giriş yap.
Hata ayıklamaya çalıştığımda, BarcodeReadOut iki kez çağrılır.
Oturum kapandığında, oturum açma ekranı açılmadan önce removeInstance() çağrılır ve Ana form Kapat() ve Dispose() şeklindedir.
Birisi bana, söz konusu olayların çoğaltılmasını nasıl önleyebilirim?

Ben de etkinliğe kayıt olmadan önce yapmış ama hiçbir şey olmuyor:

public Main() 
    { 
     barcode.BarcodeReadOut -= new barcode.BarcodeReadHandler(getBarcodeStr); 
     barcode.BarcodeReadOut += new barcode.BarcodeReadHandler(getBarcodeStr); 
    } 
+2

tüm temizleyebilirsiniz Ve o olayın gerçekleştiğini (sizin durumunuzda bir form sınıfı) diğer sınıflar uyaran bir özel etkinlik eklemek için iyi olabilir yansımaları ile eventubscriptions. Http://stackoverflow.com/questions/91778/how-to-remove-all-event-handlers-from-a-control –

+1

'a bakabilirsiniz' barcode.BarcodeReadOut == null 'kontrol edebilirsiniz Yukarıdaki bağlantı – Hassan

+1

iyi, ama kabul edilen cevap en iyi gibi göründüğünden, bunu okumak için emin olun. – TaW

cevap

0

ekleyebilir ve aşağıdaki gibi işleyicisi kaldırmak olmalıdır: Ayrıca

public partial class Main : Form 
{ 
    private Barcode barcode = null; 

    public Main() 
    { 
    barcode.BarcodeReadOut += getBarcodeStr; 
    } 

    //This is called before log-out. 
    public void removeInstance() 
    { 
    barcode.BarcodeReadOut -= getBarcodeStr; 
    } 

    private void getBarcodeStr(object sender, BarcodeEventArgs e) 
    { 
    //some code 
    } 

} 

: Sen tanımlamak gerekmez

public event EventHandler<BarcodeEventArgs> BarcodeReadOut; 
0

iyi olurdu: özel bir temsilci, sen EventHandler jenerik kullanabilirsiniz Barkod ile çalışan tüm mantığınızı ayrı bir sınıfa taşımak için.

class Barcode 
{ 
    public delegate void BarcodeReadHandler(object sender, BarcodeEventArgs e); 
    public event BarcodeReadHandler BarcodeReadOut; 

    public Barcode() 
    { 
    //.. some codes for getting data on the scanner 
    BarcodeEventArgs args = new BarcodeEventArgs(scannedData); 
    BarcodeReadOut(this, args); 
    } 

} 

class BarcodeWorker 
{ 
    private Barcode barcode = null; 
    private BarcodeReadHandler handler; 
    public event BarcodeEventArgs scanComplete; 

    BarcodeWorker(Barcode barcode) 
    { 
     if(barcode == null) this.barcode = barcode; 
    } 

    public AddEventHandler() 
    { 
     if(handler != null) return; 
     handler = new BarcodeReadHandler(getBarcodeStr); 
     barcode.BarcodeReadOut += handler; 
    } 

    //This is called before log-out. 
    public void RemoveEventHandler() 
    { 
     barcode.BarcodeReadOut -= handler; 
     handler = null; 
    } 

    private void getBarcodeStr(object sender, BarcodeEventArgs e) 
    { 
     scanComplete(sender, e); 
    } 
} 

Ve bu gibi kullanmak:

BarcodeWorker barcode = new BarcodeWorker(); 

barcode.scanComplete += // your delegate with event handler or with anonymous method here;