2010-01-22 32 views
6

Tôi có một ứng dụng ping mọi IP có thể trên mạng con cục bộ của bạn để biên dịch danh sách địa chỉ IP đáp ứng. Hiện tại nó ping tất cả 255 tại một thời điểm. Có thể chuyển đổi ứng dụng này để sử dụng nhiều chủ đề để tăng tốc độ bằng cách ping nhiều lần cùng một lúc không? Tôi mới đến khái niệm của nhiều chủ đề và con số này sẽ là một cách tốt để tìm hiểu (miễn là nó có thể tất nhiên).Chuyển đổi ứng dụng Ping sang phiên bản đa luồng để tăng tốc độ - C#

cũng vậy, mọi cải tiến về phong cách bạn có thể giáo dục tôi cũng sẽ hữu ích.

cảm ơn trước thời hạn

Đây là phương pháp ping hiện tại trong sự kiện backgroundWorker1_DoWork.

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

    } 

Trả lời

2

Có vẻ như Ping có chức năng SendAsync. This bài (tôi biết vb của nó, nhưng chỉ để có được một ý tưởng) có một ví dụ. Tóm lại, chỉ cần thay đổi Gửi đến SendAsync của bạn và lắng nghe sự kiện PingCompleted

1

Vâng lời khuyên của tôi là xem xét các điểm tương tranh của bạn.

Trước hết, bạn sẽ gặp lỗi khi truy cập vào bất kỳ cửa sổ nào tạo thành đối tượng khỏi chuỗi. tức là quyền truy cập của bạn vào button1 S throw sẽ ném MDA vào gỡ lỗi và có thể gặp sự cố khi chạy một cách ngẫu nhiên. Bạn phải sử dụng một đại biểu và gọi phương thức trở lại trên chủ đề chính bằng cách sử dụng một mẫu như thế này.

this.Invoke(delgatetomyupdatermethod) 

Thứ hai, thời gian của bạn được chi tiêu trong chính ping đó. Vì vậy, tôi muốn giới thiệu cách viết một danh sách threadsafe (chỉ cần viết một phương thức với một khóa trên nó

private object locker = new object(); 

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

tôi sẽ khuyên bạn nên sử dụng threadpool Net để chạy phương pháp của bạn thay vì để ping một IP nhất định.

Để làm Điều này viết một chức năng mà sẽ có trong IP để ping và cập nhật danh sách với kết quả của bạn, sau đó gọi nó bằng cách xếp hàng lên trên threadpool.Đặc biệt nếu bạn vượt qua trong một đối tượng với một ManualResetEvent bạn thậm chí có thể viết mã của bạn để nói

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

nơi phương thức là ping phương pháp, obj chứa một đối tượng với manualresetevent và thông tin phương pháp của bạn cần ping nó mục tiêu.

Mỗi lần waithandle của bạn hoàn tất, bạn có thể cập nhật trạng thái của mình. Với một số nỗ lực nhiều hơn trên GUI của bạn, bạn thậm chí có thể có hệ thống làm việc không đồng bộ, để gui của bạn được cập nhật trên mỗi phản ứng, không chỉ ở cuối.

+0

Tôi chắc chắn điều này có ý nghĩa hoàn toàn, tôi chỉ không biết nó nói gì, lol. Xin lỗi nếu tôi là biện pháp khắc phục, giải pháp này là trên đầu của tôi, có lẽ có nghĩa là câu hỏi của tôi là trên đầu của tôi cũng có. – user48202

+0

làm thế nào để vượt qua một đối số trong khi gọi một phương thức như thế này ipList.Invoke (new MethodInvoker (UpdateIpList (lineBuffer))); Nó liên tục nói với tôi rằng "UpdateIpList (lineBuffer)" không phải là một phương thức. – user48202

+0

Hình thức và chuỗi Windows không dễ làm. cùng một điều với đồng thời, phải mất một chút học tập để làm cho nó đúng. Tôi rất khuyên bạn nên "Lập trình Visual C# 2008 thư viện lớp cơ sở" trong đó có một giới thiệu tuyệt vời để luồng (và tất cả các phần tốt của khuôn khổ quá.) – Spence

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