2013-05-11 27 views
6

Tôi đang phát triển một thư viện (DLL), trong đó tôi cần cung cấp sự kiện (ngắt) cho người dùng như một phương thức có dữ liệu. Công việc của thư viện là bắt đầu liệt kê trên socket, nhận dữ liệu từ socket và chuyển dữ liệu này cho người dùng trong một phương thức.Cách tạo callback (event) từ thư viện đến ứng dụng trong C#

Thư viện:

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

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

} 

Ứng dụng:

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

Làm thế nào để nâng cao sự kiện để ứng dụng với dữ liệu từ thư viện?

Cảm ơn trước ....

Trả lời

11

Thêm sự kiện vào thư viện của bạn như thế này:

public event Action<string> OnDataReceived = null; 

Sau đó, trong Ứng dụng:

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

Vậy đó. Tuy nhiên, bạn có thể muốn viết các sự kiện với các quy ước và tôi khuyên bạn nên bắt đầu sử dụng nó vì .NET đang sử dụng các sự kiện theo cách đó để bất cứ khi nào bạn gặp phải quy ước đó, bạn sẽ biết đó là sự kiện. Vì vậy, nếu tôi refactor code của bạn một chút nó phải được cái gì đó như:

Trong thư viện lớp học của bạn:

//... 
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" }); 
    } 
} 

Khi thư viện lớp của bạn muốn để khởi động sự kiện đó nên gọi OnDataReceived đó là trách nhiệm kiểm tra xem ai đó đang lắng nghe và xây dựng EventArgs thích hợp để truyền dữ liệu của bạn cho người nghe.

Trong ứng dụng bạn nên thay đổi phương pháp chữ ký của bạn:

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 cho ".NET đang sử dụng sự kiện theo cách đó" và cũng đề cập đến câu trả lời 'Hành động'. –

1

Bạn nên thay đổi chữ ký của phương pháp bắt đầu để vượt qua có đại biểu:

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, Câu trả lời hay, ngắn & đơn giản & làm việc. Hoàn hảo. –

0

Thêm sự kiện vào lớp học của bạn

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

Tạo một lớp nội dung yêu cầu các thông số của bạn như Ex: SocketDataReceivedEventArgs đây

Sự kiện kích hoạt như

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

trong ứng dụng tạo ra phương pháp

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

Tiếp theo, gắn xử lý để nó

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

Bạn cần phải viết nó trong nhiều chủ đề như yêu cầu của bạn là Sau đây là cách bạn có thể thêm chủ đề hỗ trợ an toàn để trên

Dispatcher.Invoke and accessing textbox from another thread

Các vấn đề liên quan