2013-05-11 4 views
6

Sto sviluppando una libreria (DLL), in cui è necessario fornire l'evento (interrupt) all'utente come un metodo con i dati. Il lavoro della biblioteca è avviare l'elenco sul socket, ricevere i dati dal socket e trasmettere questi dati all'utente in un unico metodo.Come generare il callback (evento) dalla libreria all'applicazione in C#

libreria:

public void start(string IP, int port) 
{ 
    // start logic... 

    // receives data from socket... send this data to user 

} 

Applicazione:

Library. Class a = new Library. Class(); 
a.start(ip, port); 

// I need this method called by library automatically when it receives data... 

void receivedData(string data) 
{ 
    // data which received by library.... 
} 

come allevare evento per applicazione con i dati di biblioteca?

Grazie in anticipo ....

risposta

11

aggiungere un evento alla libreria in questo modo:

public event Action<string> OnDataReceived = null; 

Quindi, in Applicazione:

Library.Class a = new Library.Class(); 
a.OnDataReceived += receivedData; 
a.start(ip, port); 

Questo è tutto.

Ma potresti voler scrivere eventi con le convenzioni e ti suggerisco di iniziare ad usarlo perché .NET sta usando gli eventi in quel modo quindi ogni volta che incontri questa convenzione saprai che sono eventi. Quindi, se ho refactoring del codice di un po 'dovrebbe essere qualcosa di simile:

Nella libreria di classi:

//... 
public class YourEventArgs : EventArgs 
{ 
    public string Data { get; set; } 
} 
//... 

public event EventHandler DataReceived = null; 
... 
protected override OnDataReceived(object sender, YourEventArgs e) 
{ 
    if(DataReceived != null) 
    { 
     DataReceived(this, new YourEventArgs { Data = "data to pass" }); 
    } 
} 

Quando la libreria di classi vuole lanciare l'evento si deve chiamare l'OnDataReceived che è responsabile per controllando che qualcuno stia ascoltando e costruendo gli EventArgs appropriati per il passaggio dei dati al listener.

In applicazione si dovrebbe cambiare il metodo di firma:

Library.Class a = new Library.Class(); 
a.DataReceived += ReceivedData; 
a.start(ip, port); 

//... 

void ReceivedData(object sender, YourEventArgs e) 
{ 
    string data = e.Data; 
    //... 
} 
+0

+1 per ".NET sta usando gli eventi in questo modo" e menziona anche la risposta "Azione". –

1

Si dovrebbe cambiare firma del metodo start per passare lì delegato:

public void start(string IP, int port, Action<string> callback) 
{ 
    // start logic... 

    // receives data from socket... send this data to user 
    callback(data); 
} 

Library. Class a = new Library. Class(); 
a.start(ip, port, receivedData); 

// I need this method called by library automatically when it receives data... 

void receivedData(string data) 
{ 
    // data which received by library.... 
} 
+0

+1, Bella risposta, breve e semplice e funzionante. Semplicemente perfetto. –

0

Aggiungi l'evento alla classe

public event DataReceivedEventHandler DataReceived; 
public delegate void DataReceivedEventHandler(object sender, SocketDataReceivedEventArgs e); 

Creare una classe che contenuti i parametri richiesti come Es: SocketDataReceivedEventArgs qui

Trigger event come

SocketDataReceivedEventArgs DataReceiveDetails = new SocketDataReceivedEventArgs(); 
DataReceiveDetails.data = "your data here"; 
DataReceived(this, DataReceiveDetails); 

in applicazione creare metodo

void receivedData(object sender, SocketDataReceivedEventArgs e) 
{ 
    // e.data is data which received by library.... 
} 

Ora allegare gestore ad esso

Library. Class a = new Library. Class(); 
    a.DataReceived += receivedData; 
    a.start(ip, port); 

Hai bisogno di scrivere in più thread come vostro requisito è Ecco come è possibile aggiungere thread di supporto sicuro sopra

Dispatcher.Invoke and accessing textbox from another thread