我正在使用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);
}
}
我有一个网址列表,我使用Parallel.ForEach一次运行多个网址。
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正在被另一个程序使用。这不会一直发生,但一旦发生就会发生,程序会崩溃。
问题:我该怎么做才能避免此错误?或者,有没有其他方法可以做到这一点?
答案 0 :(得分:2)
由于StreamWriter不是线程安全的,因此使用lock语句来锁定写入过程,以便其他线程无法进入该行并导致冲突:http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.100).aspx