我将锁定在几行上,这些行应该获取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'
,因为它正由另一个进程使用。
答案 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;
}
}