我正在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正被另一个程序使用。这种情况不会一直发生,但偶尔会发生,程序就会崩溃。
问题:我应该怎么做才能避免此错误?或者,有其他方法吗?
因为StreamWriter不是线程安全的,所以使用lock语句来锁定写入过程,这样其他线程就不能进入该行并导致冲突:http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.100).aspx