For循环C#上的MultiThread

时间:2015-01-30 03:47:12

标签: c# multithreading .net-2.0

我正在制作一个程序来检查公司服务器的状态。 我的服务器infor将加载到DgvServer中 我使用for循环来检查服务器的状态:

    private void btnCheck_Click(object sender, EventArgs e)
    {
        try
        {
            string ip = "";
            Ping ping = new System.Net.NetworkInformation.Ping();
            PingReply pingreplay = null;
            for (int i = 0; i < dgvServer.Rows.Count; i++)
            {
                //Get IP address
                ip = dgvServer.Rows[i].Cells[1].Value.ToString();
                pingreplay = ping.Send(ip,10000);
                if (pingreplay.Status == IPStatus.Success)
                {
                    //update status of server
                    dgvServer.Rows[i].Cells[4].Value = "Online";
                }
                else
                   //Update status of server
                    dgvServer.Rows[i].Cells[4].Value = "Offline";
            }
        }
        catch(Exception ex)
            {
                MessageBox.show(ex.Message);
            }
    }

如果所有服务器都在线,则可以,但如果某些服务器脱机,则此代码需要很长时间才能完成。所以,我想为每个循环使用一个线程来检查每个服务器的状态。我不使用parallel,因为这是.net 2.0程序。 请给我一些建议,以使用线程改进此代码。 非常感谢!

2 个答案:

答案 0 :(得分:0)

尝试Parallel.For或Parallel.Foreach。

有关详细信息,请参阅此链接https://msdn.microsoft.com/en-us/library/dd460713(v=vs.110).aspx

答案 1 :(得分:0)

这是Parallel.For的一个漂亮的实现,适用于.NET 2.0

  

在本文中,我们将看到一种在C#2.0中实现具有相同行为的静态For方法的方法。

https://dotnetgalactics.wordpress.com/2009/11/19/how-to-provide-a-parallel-for-loop-in-c2-0-2/

您可以使用文章中提供的方法使用Parallel.For循环并行轮询所有服务器。

请注意,只要最长的单个服务器检查完成,它仍将阻止UI。

要考虑的另一个选择是将该代码块放入BackgroundWorker,以便不阻止UI。

  

BackgroundWorker类允许您在单独的专用线程上运行操作。下载和数据库事务等耗时的操作可能会导致用户界面(UI)在运行时停止响应。当您需要响应式UI并且您遇到与此类操作相关的长时间延迟时,BackgroundWorker类提供了一种方便的解决方案。

您可以为每个服务器创建一个BackgroundWorker进行更新,允许每个服务器的状态在响应进入后立即在网格中更新,或者您只需创建一个BackgroundWorker(可能使用上面的Parallel.For实现)。