1

我正在使用 C# .Net4.0 在 Visual Studio 2010 中构建一个程序

我有一个接收 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。这不会一直发生,但有时会发生,程序会崩溃。

问题:我应该怎么做才能避免这个错误?或者,有没有其他方法可以做到这一点?

4

1 回答 1

2

因为 StreamWriter 不是线程安全的,所以使用 lock 语句来锁定写入过程,因此其他线程无法进入该行并导致冲突:http: //msdn.microsoft.com/en-us/library/c5kehkcz( v=vs.100).aspx

于 2013-07-09T20:40:43.477 回答