2010-06-22 38 views
18

Làm cách nào để truyền tham số cho hàm được gọi bởi ElapsedEventHandler?Làm thế nào để truyền tham số cho hàm được gọi bởi ElapsedEventHandler?

Mã của tôi:

private static void InitTimer(int Index) 
{ 
    keepAlive[Index] = new Timer(); 
    keepAlive[Index].Interval = 3000; 
    keepAlive[Index].Elapsed += new ElapsedEventHandler(keepAlive_Elapsed[, Index]); 
    keepAlive[Index].Start(); 
} 

public static void keepAlive_Elapsed(object sender, EventArgs e[, int Index]) 
{ 

    PacketWriter writer = new PacketWriter(); 
    writer.AppendString("KEEPALIVE|.\\"); 
    ServerSocket.Send(writer.getWorkspace(), Index); 
    ServerSocket.DisconnectSocket(Index); 
} 

Những gì tôi muốn làm là giữa dấu ngoặc ([và]). Nhưng chỉ làm như vậy rõ ràng là không hoạt động ...

+1

(Thật buồn cười trở lại câu hỏi cũ và xem có bao nhiêu bạn đã học được trong vòng 3 năm trở lại đây và làm thế nào bạn Đây là một trong những lý do tôi thích trang web này.) – lesderid

Trả lời

39

Bạn không thể làm điều này trong chính phương thức - bạn phải làm cho trình xử lý sự kiện của bạn nhận thức được ngữ cảnh của nó một cách hiệu quả. Cách đơn giản nhất để làm điều này là với một biểu thức lambda hoặc phương pháp vô danh:

private static void InitTimer(int Index) 
{ 
    keepAlive[Index] = new Timer(); 
    keepAlive[Index].Interval = 3000; 
    keepAlive[Index].Elapsed += delegate { KeepAliveElapsed(Index); }; 
    keepAlive[Index].Start(); 
} 

public static void KeepAliveElapsed(int Index) 
{  
    PacketWriter writer = new PacketWriter(); 
    writer.AppendString("KEEPALIVE|.\\"); 
    ServerSocket.Send(writer.getWorkspace(), Index); 
    ServerSocket.DisconnectSocket(Index); 
} 

Ở đây, phương pháp vô danh (bit với từ khóa delegate) đã tạo ra một đại biểu mà biết về Index tham số để InitTimer. Nó chỉ gọi phương thức KeepAliveElapsed. Tôi đã sử dụng cú pháp phương thức ẩn danh vì bạn không cần người gửi hoặc sự kiện args; nếu bạn đã làm cần chúng tôi có thể sử dụng biểu thức lambda thay thế, ví dụ:

private static void InitTimer(int Index) 
{ 
    keepAlive[Index] = new Timer(); 
    keepAlive[Index].Interval = 3000; 
    keepAlive[Index].Elapsed += (sender, args) => KeepAliveElapsed(sender, Index); 
    keepAlive[Index].Start(); 
} 

public static void KeepAliveElapsed(object sender, int Index) 
{  
    PacketWriter writer = new PacketWriter(); 
    writer.AppendString("KEEPALIVE|.\\" + sender); 
    ServerSocket.Send(writer.getWorkspace(), Index); 
    ServerSocket.DisconnectSocket(Index); 
} 

(Lưu ý rằng thông thường các tham số Index nên được gọi là index, btw.)

+0

Tôi gặp khó khăn khi hiểu điều này. Sự kiện đã trôi qua có mong đợi một đại biểu ElapsedEventHandler không? – SWeko

+0

Cảm ơn bạn đã chấp nhận! Nhưng tại sao nó nên được gọi là chỉ mục? – lesderid

+0

@lesderid: Các tên tham số thường là camelCase thay vì PascalCase. –

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