锁定在c#中无法正常工作

时间:2012-09-01 06:54:04

标签: c# multithreading visual-studio-2010 locking

我将锁定在几行上,这些行应该获取cookie文件并读取它们,但我发现有时会出现错误,说文件已经在使用中!所以不确定什么是错的......

代码:

private Object cookieLock = new Object();

main{
    for (int j = 0; j < maxThreads; j++)
        {
            //   Thread thread = new Thread(new ThreadStart(startPosting2(worker)));
            Thread thread = new Thread(() => postingFunction2());
            thread.IsBackground = true;
            thread.Start();
        }
    }

public void postFunction2()
{
 string tmpUsername = string.Empty;
 string[] array2 = null;
   try
    {
      lock (cookieLock)
       {
          array2 = File.ReadAllLines(tmpUsername + ".txt");
       }
    }
   catch(Exception ex)
    {
      TextWriter sUrl = new StreamWriter("readingSameCookieFile.txt", true);
      sUrl.WriteLine(exp.ToString());
      sUrl.Close();
    }
}

我做错了吗?这些行同时由20-100个线程执行,我看不太多,但我确实看到了一段时间,所以想知道为什么!

TXT FILE ERROR:

  

System.IO.IOException:进程无法访问文件'C:\Users\Administrator\My Projects\Bot Files\2 Message Poster Bot\MessagePoster - NoLog - Copy\cookies\LaureneZimmerebner57936.txt',因为它正由另一个进程使用。

3 个答案:

答案 0 :(得分:1)

我建议只读取一次文件并在20-100线程中共享array2,因为多次读取会导致性能下降。同样在多线程环境中,建议将所有I / O操作保持在单线程中。

如果只有所有线程都能读取,那么共享array2将不需要锁定。

Debug.Write(file name);// to make sure each thread opens different file.

答案 1 :(得分:1)

您正在尝试阅读Cookie;可能是浏览器或代码外的其他应用程序访问/写入cookie文件,因此例外。

你还没有发布整个代码,只是确保锁定对象没有被多次实例化或确保它是静态的。 也可以在阅读后尝试添加Thread.Sleep(0);看看是否有帮助。

如果您将array2的内容写入另一个文件,请确保在写入后正确处理/关闭。

尝试将整个方法放入锁定块

public void postFunction2() 
{ 
 lock (cookieLock) 
 { 
 string tmpUsername = string.Empty; 
 string[] array2 = null; 
   try 
    { 
          array2 = File.ReadAllLines(tmpUsername + ".txt"); 
    } 
   catch(Exception ex) 
    { 
      TextWriter sUrl = new StreamWriter("readingSameCookieFile.txt", true); 
      sUrl.WriteLine(exp.ToString()); 
      sUrl.Close(); 
    } 
  }
} 

答案 2 :(得分:0)

如果你只是想克服你遇到的问题并且确定它没有被写入,那么你可以使用这个功能而不是File.ReadAllLines。关键是它提供的共享选项FileShare.ReadWrite

private static string[] ReadAllLines(string fileName)
{
  using (var fs = new FileStream(fileName, FileMode.Open,
                                           FileAccess.Read,
                                           FileShare.ReadWrite))
  {
    var reader = new StreamReader(fs);
    //read all at once and split, or can read line by line into a list if you prefer
    var allLines = reader.ReadToEnd().Split(new string[] { "\r\n", "\r", "\n" },
                                            StringSplitOptions.None);
    return allLines;
  }
}