正如其他海报所示,尝试执行IO的多个线程会导致问题。然而,它们可以用来构建完整的线程队列(如果它非常深的话),然后用一个单独的线程来执行文件上的正则表达式。有点像这样:
class Program
{
static void Main(string[] args)
{
ConcurrentQueue<DirectoryInfo> concurrentQueue = new ConcurrentQueue<DirectoryInfo>();
GetAllDirectories(new DirectoryInfo(@"C:\local\oracle"), concurrentQueue);
Action action =() =>{
const string toFind = "ora";
DirectoryInfo info;
while(concurrentQueue.TryDequeue(out info))
{
FindInFile(toFind, info);
}
};
Parallel.Invoke(action, action, action, action);
Console.WriteLine("total found " + _counter);
Console.ReadKey();
}
static int _counter = 0;
static void FindInFile(string textToFind,DirectoryInfo dirInfo)
{
var files =dirInfo.GetFiles();
foreach(FileInfo file in files)
{
using (StreamReader reader = new StreamReader(file.FullName))
{
string content = reader.ReadToEnd();
Match match = Regex.Match(content, textToFind, RegexOptions.Multiline);
if(match.Success)
{
Interlocked.Increment(ref _counter);
Console.WriteLine(file.FullName + " found " + match.Captures.Count);
foreach(var t in match.Captures)
{
Console.WriteLine("-------------> char index" + match.Index);
}
}
}
}
}
internal static void GetAllDirectories(DirectoryInfo root, ConcurrentQueue<DirectoryInfo> values)
{
foreach (var di in root.GetDirectories())
{
GetAllDirectories(di, values);
values.Enqueue(di);
}
}
}
这是一个非常好的问题。 – 2011-06-09 18:13:51