1

我锁定了几行应该获取 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 文件错误:

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

4

3 回答 3

1

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

如果仅由所有线程读取,则共享 array2 将不需要锁。

Debug.Write(file name);// to make sure each thread opens different file.
于 2012-09-01T07:13:52.590 回答
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(); 
    } 
  }
} 
于 2012-09-01T07:43:50.230 回答
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;
  }
}
于 2012-09-01T08:28:09.930 回答