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);
}
}
}
}
这段代码工作得很好,我得到了正确的值,但是处理这个需要很长时间,而且大多数时候应用程序会挂起。
我是新的线程,所以有一种方法来实现它。举个例子会很有帮助
如果有其他更好的方法,请告诉我。
谢谢
查看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),这不必是一个单一的值…它可以是被强制转换为对象的数组、列表等。当使用列表等时,你可能需要查找一些线程安全=,但我觉得这可能比你现在使用线程做的更多。
.
.
如果有帮助请评分