Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在处理web请求时写入日志时出错_C#_Webrequest_Parallel.foreach_File In Use - Fatal编程技术网

C# 在处理web请求时写入日志时出错

C# 在处理web请求时写入日志时出错,c#,webrequest,parallel.foreach,file-in-use,C#,Webrequest,Parallel.foreach,File In Use,我正在VisualStudio2010中使用C#.Net4.0构建一个程序 我有一个函数,它接收url并尝试获取响应。在函数内部,我写入一个日志文件,说明成功和错误 public void getResponse(string url, System.IO.StreamWriter writer) { try { WebRequest request = WebRequest.Create(url); WebResponse response =

我正在VisualStudio2010中使用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语句锁定写入过程,以便其他线程无法进入该行并导致冲突:

StreamWriter不是线程安全的。看到了吗?如果我这样做,它会工作吗<代码>对象mylock=新对象();lock(mylock){writeToLog(“Error:+ex.message,writer);}每次锁定时,您应该只创建一个锁定对象,而不是一个新的锁定对象。您希望使用代码尝试锁定相同的内容。正如hatchet所说,您应该在包含get response的类中创建一个私有字段。如果你这样做,它应该会起作用。试一试,如果问题仍然存在,我会试着想想别的办法。好的!我试试看!就像我说的,这个问题并不是每次跑步都会发生,所以我可能需要一段时间才能自信地说解决这个问题。谢谢你的帮助:)很高兴看到这个工作。我自己从来不用使用lock语句,但知道这些事情不会有什么坏处。