GetResponse()耗时太长

本文关键字:GetResponse | 更新日期: 2023-09-27 18:14:28

我正在做一个winforms应用程序。

我有一个函数来验证URL。

  private void checkForSPSiteValidity(DataGridView Sites_dataGridView)
    {
        foreach (DataGridViewRow myRow in SharePointSites_dataGridView.Rows)
        {
            try
            {
                DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell;
                string url = myRow.Cells[CommonCodeClass.spURL_GridCol].Value.ToString();
                WebRequest req = WebRequest.Create(url);
                WebResponse res = req.GetResponse();
                cell.Value = Image.FromFile(CommonCodeClass.Correct_Icons);
            }
            catch (WebException ex)
            {
                Console.WriteLine(ex.Message);
                if (ex.Message.Contains("remote name could not be resolved"))
                {
                    DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell;
                    cell.Value = Image.FromFile(CommonCodeClass.warning_Icon);
                }
            }
        }
    }

这段代码工作得很好,我得到了正确的值,但是处理这个需要很长时间,而且大多数时候应用程序会挂起。

我是新的线程,所以有一种方法来实现它。举个例子会很有帮助

如果有其他更好的方法,请告诉我。

谢谢

GetResponse()耗时太长

查看BackgroundWorker控件。这是一种简单的方法。

HTH .

正如您自己指出的那样,您必须异步执行获取。BackgroundWorker是一个很好的开始类,特别是因为它是一个本地的WinForms组件。

如果你想以更通用的方式解决这个问题,你也可以看看c#中新的异步扩展。

一个很好的方法是使用线程池:

  • http://msdn.microsoft.com/en-us/library/3dasc8as%28v=vs.80%29.aspx
  • http://www.switchonthecode.com/tutorials/csharp-tutorial-using-the-threadpool

它很容易实现,并且在处理大量请求时非常出色。

你也可以指定一个最大的线程数和循环做15、25、50等,这样你就不会削减太多的线程,最终削减更多的线程,这是有好处的。我想尝试一下,看看你什么时候开始松散的优化。

的好处是(见第一个链接),你传递一个对象(对象threadContext),这不必是一个单一的值…它可以是被强制转换为对象的数组、列表等。当使用列表等时,你可能需要查找一些线程安全=,但我觉得这可能比你现在使用线程做的更多。

.

.

如果有帮助请评分