【发布时间】:2015-05-19 05:31:10
【问题描述】:
我希望方法 splitFile 的单独异步线程应该运行,以便任务变得更快,但下面的代码不起作用。当我调试时,它到达RecCnt = File.ReadAllLines(SourceFile).Length - 1; 行并出来。请帮忙。
public delegate void SplitFile_Delegate(FileInfo file);
static void Main(string[] args)
{
DirectoryInfo d = new DirectoryInfo(@"D:\test\Perf testing Splitter"); //Assuming Test is your Folder
FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files
foreach (FileInfo file in Files)
{
SplitFile_Delegate LocalDelegate = new SplitFile_Delegate(SplitFile);
IAsyncResult R = LocalDelegate.BeginInvoke(file, null, null); //invoking the method
LocalDelegate.EndInvoke(R);
}
}
private static void SplitFile(FileInfo file)
{
try
{
String fname;
//int FileLength;
int RecCnt;
int fileCount;
fname = file.Name;
String SourceFile = @"D:\test\Perf testing Splitter\" + file.Name;
RecCnt = File.ReadAllLines(SourceFile).Length - 1;
fileCount = RecCnt / 10000;
FileStream fs = new FileStream(SourceFile, FileMode.Open);
using (StreamReader sr = new StreamReader(fs))
{
while (!sr.EndOfStream)
{
String dataLine = sr.ReadLine();
for (int x = 0; x < (fileCount + 1); x++)
{
String Filename = @"D:\test\Perf testing Splitter\Destination Files\" + fname + "_" + x + "by" + (fileCount + 1) + ".txt"; //test0by4
using (StreamWriter Writer = file.AppendText(Filename))
{
for (int y = 0; y < 10000; y++)
{
Writer.WriteLine(dataLine);
dataLine = sr.ReadLine();
}
Writer.Close();
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
【问题讨论】:
-
“出来了”是什么意思?例外?阻止?
-
它执行成功但没有给出任何结果(不拆分文件)。在那一行之后它返回到主函数,再次返回到具有下一个文件名的拆分文件并再次执行相同操作。
-
作为旁注:一般
async != faster -
紧跟在
BeginInvoke之后的EndInvoke是我见过的最糟糕的异步反模式——你想在这里做什么? -
您的代码实际上是否已使 CPU 内核完全饱和?我很确定你会受到 I/O 的限制,而不是 CPU 负载(除非你有一个相当大的 SSD RAID 阵列:))。在问题上投入更多线程不会有帮助 - 你能做的最好的事情就是消除
ReadAllLines和实际工作之间的 CPU 时间。但是,如果您只是不读取文件两次,您将节省更多。您已经拥有内存中的所有行,那么为什么要扔掉它们并再次处理文件呢?使用这种愚蠢的阅读模式?ReadLine在最后一行返回null,无需检查 EOF :)
标签: c# asynchronous delegates