2010-06-22 15 views
18

ElapsedEventHandler द्वारा बुलाए गए फ़ंक्शन के पैरामीटर कैसे पास करें?ElapsedEventHandler द्वारा बुलाए गए फ़ंक्शन के पैरामीटर कैसे पास करें?

मेरे कोड:

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

मुझे क्या करना चाहते हैं कोष्ठक के बीच है ([और])। लेकिन ऐसा करने से यह स्पष्ट रूप से काम नहीं करता है ...

+1

(यह पुराने सवाल करने के लिए आते हैं और देखते हैं आप कितना पिछले 3 वर्षों में सीखा है और कैसे आप के लिए मज़ेदार है विकसित हुआ है। यह इस कारण से एक कारण है।) – lesderid

उत्तर

39

आप इसे विधि के भीतर ही नहीं कर सकते - आपको अपने ईवेंट हैंडलर को इसके संदर्भ के बारे में जागरूक करना होगा। ऐसा करने का सबसे आसान तरीका है एक लैम्ब्डा अभिव्यक्ति या अनाम विधि के साथ है:

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

यहाँ, गुमनाम विधि (delegate कीवर्ड के साथ बिट) एक प्रतिनिधि जो InitTimer करने के लिए Index पैरामीटर के बारे में जानता बनाया गया है। यह सिर्फ KeepAliveElapsed विधि को कॉल करता है। मैंने अनाम विधि वाक्यविन्यास का उपयोग किया है क्योंकि आपको प्रेषक या ईवेंट तर्क की आवश्यकता नहीं थी; यदि आप की आवश्यकता है तो मैं शायद इसके बजाय लैम्ब्डा अभिव्यक्ति का उपयोग करूंगा, उदा।

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

(ध्यान दें कि पारंपरिक Index पैरामीटर index बुलाया जाना चाहिए, btw।)

+0

मुझे इसे समझने में परेशानी है। क्या विलुप्त घटना एक ElapsedEventHandler प्रतिनिधि की उम्मीद नहीं है? – SWeko

+0

धन्यवाद, स्वीकार किया! लेकिन इसे सूचकांक क्यों कहा जाना चाहिए? – lesderid

+0

@lesderid: पैरामीटर नाम परंपरागत रूप से पास्कलकेस के बजाय ऊंट में होते हैं। –

संबंधित मुद्दे