Ошибка при записи в журнал при многопоточности веб-запросов
Я строю программу в Visual Studio 2010 с использованием C# .Net4.0
У меня есть функция, которая принимает URL-адрес и пытается получить ответ. Внутри функции я записываю в лог-файл сообщения об успехах и ошибках.
public void getResponse(string url, System.IO.StreamWriter writer)
{
try
{
WebRequest request = WebRequest.Create(url);
WebResponse response = request.GetResponse();
// Display the status.
Console.WriteLine(response.Headers);
writeToLog("Success: " + url, writer);
}
catch (WebException ex)
{
writeToLog("Error: " + ex.message, writer);
}
}
У меня есть список URL-адресов, и я использую Parallel.ForEach для запуска нескольких URL-адресов одновременно.
System.IO.StreamWriter writer = new System.IO.StreamWriter("program.log", true);
string[] urls = {url1, url2, url3, url4, etc}; //have around 30 urls
Parallel.ForEach(urls, url => getResponse(url, writer));
Когда я запускаю программу, иногда я получаю сообщение о том, что program.log используется другой программой. Это не происходит постоянно, но время от времени это происходит, и программа падает.
Вопрос: Что я должен сделать, чтобы избежать этой ошибки? Или есть альтернативный способ сделать это?
1 ответ
Поскольку StreamWriter не является поточно-ориентированным, используйте оператор блокировки для блокировки процедуры записи, чтобы другие потоки не могли войти в эту строку и вызвать конфликт: http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.100).aspx