Вы не можете ускорить вещи много потому, что узким местом является подключение к Интернету. Однако есть что-то, что вы можете сделать:
1) Не линии линий LINQ, это массив и его размер известен (микро оптимизация, вы никогда не заметите это изменение).
2) Используйте using
для выпуска одноразовых объектов (ничего общего со скоростью, лучшей обработкой ошибок: если что-то пошло не так с вашим кодом, вы будете освобождать ресурсы с помощью GC).
3) Сделайте их параллельными. Это позволит ускорить вещи немного немного:
private void button4_Click(object sender, EventArgs e)
{
var lines = File.ReadAllLines(@"c:\data\temp.txt");
var options = new ParallelOptions { MaxDegreeOfParallelism = 4 };
Parallel.ForEach(lines, options, line =>
{
var request = WebRequest.Create(line);
using (var response = request.GetResponse())
{
var reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);
// Do your stuff
BeginInvoke(new MethodInvoker(delegate
{
textBox1.Text += ".";
}));
}
});
}
Несколько больше нот:
MaxDegreeOfParallelism
устанавливает максимальное количество одновременных запросов. Несколько активных одновременных подключений не ускорят работу на неопределенный срок, и они могут даже замедлить работу. Некоторые испытания помогут вам установить это значение в разумным значением.
Нет ошибок при проверке, но сетевые вещи могут временно ошибаться, но после небольшой задержки они могут работать должным образом. Я предлагаю также читать System.Net.WebException: The remote name could not be resolved и this для операций ввода-вывода.
Чтобы сделать его более полный пример, ваш клик даже обработчик будет:
private void button4_Click(object sender, EventArgs e)
{
var options = new ParallelOptions { MaxDegreeOfParallelism = 4 };
Parallel.ForEach(ReadUrlList(@"c:\data\temp.txt"), options, ProcessUrl);
}
Фактический код для обработки каждого URL и читать список URL:
private static string[] ReadUrlList(string path)
{
return File.ReadAllLines(@"c:\data\temp.txt");
}
private void ProcessUrl(string url)
{
ProcessResponse(response =>
{
using (var reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
{
// Do your stuff
// We're working on separate threads, to access UI we
// have to dispatch the call to UI thread. Note that
// code will be executed asynchronously then local
// objects may have been disposed!
BeginInvoke(new MethodInvoker(delegate
{
textBox1.Text += ".";
}));
}
});
}
С помощью этого вспомогательного метода можно скрыть шаблон try/wait для сетевых операций:
private static void ProcessResponse(string url, Action<WebResponse> action)
{
for (int i=1; i <= NumberOfRetries; ++i)
{
try
{
var request = WebRequest.Create(line);
using (var response = request.GetResponse())
{
action(response);
}
break;
}
catch (Exception e)
{
if (i == NumberOfRetries)
throw;
Thread.Sleep(DelayOnRetry);
}
}
}
private const int NumberOfRetries = 3;
private const int DelayOnRetry = 1000;
Купить более быстрый интернет. – leppie
Нить. Вы можете делать больше звонков одновременно. – Lloyd