Ошибка при записи в журнал при многопоточности веб-запросов

Я строю программу в 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

Другие вопросы по тегам