2013-07-09 202 views
1

我使用C#.Net4.0错误请求

我有一个函数,它的URL,并尝试得到回应建设项目在Visual Studio 2010。在函数内部,我写入了一个记录成功和错误的日志文件。

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

的StreamWriter不是线程安全的。见http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx – user2509738

回答

2

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

+0

所以如果我做这种方式,将工作? '对象mylock = new Object(); 锁(mylock) { writeToLog( “错误:” + ex.message,作家); }' – sora0419

+2

您应该只创建一个锁定对象,而不是每次你做一个锁定时间一个新的。你想使用代码来试图锁定在同一个事物上。 – hatchet

+0

像斧头说,你应该在包含得到响应类中创建一个私有字段。如果你这样做,它应该工作。试一试,如果问题仍然存在,我会尝试去想别的。 – Pharap