2010-01-22 11 views
6

मेरे पास एक ऐसा एप्लिकेशन है जो उत्तरदायी आईपी पते की सूची संकलित करने के लिए आपके स्थानीय सबनेट पर प्रत्येक संभावित आईपी को पिंग करता है। वर्तमान में यह एक समय में सभी 255 एक को पिंग करता है। क्या इस ऐप को एक समय में एक से अधिक पिंग करके गति को बढ़ाने के लिए एकाधिक धागे का उपयोग करने के लिए परिवर्तित करना संभव है? मैं कई धागे की अवधारणा के लिए नया हूं और यह समझने का एक अच्छा तरीका होगा (जब तक यह संभव है)।पिंग एप्लिकेशन को गति बढ़ाने के लिए मल्टीथ्रेड संस्करण में कनवर्ट करें - सी #

भी, कोई स्टाइलिस्ट सुधार जो आप मुझे शिक्षित कर सकते हैं, भी सहायक होगा।

धन्यवाद समय

के आगे यहाँ एक backgroundWorker1_DoWork स्थिति में वर्तमान pinging तरीका है।

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
      count = 0; 
      for (int i = 1; i < 255; i++) 
      { 
       Ping ping = new Ping(); 
       PingReply pingreply = ping.Send(IPAddress.Parse(locip[0] + "." + locip[1] + "." + locip[2] + "." + i)); 
       count += 1; 

       if (pingreply.Status == IPStatus.Success) 
       { 
        status = "o"; 
        repAddress = pingreply.Address.ToString(); ; 
        repRoundtrip = pingreply.RoundtripTime.ToString(); 
        repTTL = pingreply.Options.Ttl.ToString(); 
        repBuffer = pingreply.Buffer.Length.ToString(); 
        string[] lineBuffer = { status, repAddress, repRoundtrip, repTTL, repBuffer }; 
        ipList.Rows.Add(lineBuffer); 

       } 
        progressBar.Invoke(new MethodInvoker(UpdateProgressBarByOne)); 
        progressStatus.Text = ("Pinging IP " + count + " of 254"); 

      } 
      button1.Enabled = true; 
      progressBar.Invoke(new MethodInvoker(ResetProgressBar)); 

    } 

उत्तर

2

ऐसा लगता है कि पिंग में SendAsync फ़ंक्शन है। This पोस्ट (मुझे इसकी वीबी पता है, लेकिन सिर्फ एक विचार पाने के लिए) एक उदाहरण है। संक्षेप में, बस अपना भेजें SendAsync में भेजें और पिंग पूर्ण घटना

1

अच्छी तरह से मेरी सलाह है कि आप अपने समवर्ती बिंदुओं को देखें।

सबसे पहले आप थ्रेड से विंडोज़ फॉर्म ऑब्जेक्ट्स के किसी भी एक्सेस के साथ एक बग हिट करेंगे। यानी बटन 1 तक आपकी पहुंच डीबग में एमडीए फेंक देगी, और रनटाइम पर यादृच्छिक रूप से क्रैश हो सकती है। आपको एक प्रतिनिधि का उपयोग करना होगा और इस तरह के पैटर्न का उपयोग करके मुख्य धागे पर विधि को वापस लेना होगा।

this.Invoke(delgatetomyupdatermethod) 

दूसरा, आपका समय पिंग में ही बिताया जाता है। तो मैं एक threadsafe सूची तैयार करने की सलाह देते हैं (सिर्फ एक तरीका है उस पर एक लॉक के साथ लिखते थे

private object locker = new object(); 

private void InsertIntoList(string linebuffer) 
{ 
    lock(locker) 
    { 
     ipList.Rows.Add(linebuffer); 
    } 
} 

मैं नेट ThreadPool उपयोग करने के बजाय अपने विधि को चलाने के लिए दिए गये IP पिंग करने की सलाह देते हैं।

ऐसा करने के लिए होगा यह एक ऐसा फ़ंक्शन लिखता है जो आईपी में पिंग करने और आपके परिणाम के साथ सूची को अपडेट करने के लिए ले जाएगा, फिर थ्रेडपूल पर आइटम क्यूइंग करके इसे कॉल करें। दरअसल यदि आप किसी मैनुअल रीसेट के साथ ऑब्जेक्ट में पास करते हैं तो आप अपना कोड भी लिख सकते हैं

System.Threading.WaitHandle[] waits = new System.Threading.WaitHandle[255]; 
//initialise the list of these and create the objects to ping. 


foreach (var obj in mylistofobjectvalues) 
{ 
    System.Threading.Threadpool.QueueUserWorkItem(method, obj); 
} 
System.Threading.WaitHandle.WaitAll(waits); 

जहां विधि पिंग है विधि, ओबीजे में मैनुअलसेटेवेंट के साथ एक ऑब्जेक्ट होता है और आपकी विधि को अपने लक्ष्य को पिंग करने की आवश्यकता होती है।

प्रत्येक बार जब आपका विथंडल पूरा हो जाता है तो आप अपना राज्य अपडेट कर सकते हैं। आपके जीयूआई पर कुछ और प्रयासों के साथ आप सिस्टम को असीमित रूप से काम कर सकते हैं, ताकि आपके गुई को प्रत्येक प्रतिक्रिया पर अपडेट किया जा सके, न कि अंत में।

+0

मुझे यकीन है कि यह पूरी तरह से समझ में आता है, मुझे नहीं पता कि यह क्या कहता है, lol। क्षमा करें अगर मैं उपचारात्मक हूं, तो यह समाधान मेरे सिर पर है, जिसका शायद मतलब है कि मेरा प्रश्न भी मेरे सिर पर है। – user48202

+0

इस ipList.Invoke (नया MethodInvoker (UpdateIpList (lineBuffer)) जैसी विधि का आविष्कार करते समय मैं एक तर्क कैसे पास करूं?); यह मुझे बताता रहता है "UpdateIpList (lineBuffer)" एक विधि नहीं है। – user48202

+0

विंडोज फॉर्म और थ्रेड करना आसान नहीं है। समरूपता के साथ एक ही बात, इसे सही करने के लिए थोड़ा सा सीखना पड़ता है। मैं अत्यधिक अनुशंसा करता हूं कि "प्रोग्रामिंग विजुअल सी # 2008 बेस क्लास लाइब्रेरी" जिसमें थ्रेडिंग (और ढांचे के सभी अच्छे हिस्सों भी) के लिए एक महान परिचय है। – Spence

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