我有一个带有冗长foreach
循环的类,可能需要一分钟甚至更长时间才能运行,具体取决于我正在解析和插入,更新等的记录数量。
所以我有一个这样的课:
public class FileManeger
{
public bool ParseFile()
{
// ....stuff
foreach(DataRow row in Rows)
{
// stuff
}
}
}
然后在我的program.cs
main method
:
FileManager manager = new FileManager();
Console.Writeline("Parsing started...");
manager.ParseFile();
Console.Writeline("Parsing Finished.");
所以我想也许在这两个消息之间我可以显示更多的反馈,例如在foreach
循环中放置一个计数器,并且每50行传递一次
打印控制台消息,如"从6500行解析行1到50"," 从6500行解析行51到100",等......
所以我认为我需要写一些event
,但我对事件没有经验,有人可以帮助这部分吗?
答案 0 :(得分:1)
如果您只是想向控制台添加更多消息,那么您可以这样做:
public bool ParseFile()
{
// ....stuff
int i = 1;
int count = Rows.Count();
foreach(DataRow row in Rows)
{
Console.WriteLine("parsing row " + i + " from " + count + " rows");
++i;
// stuff
}
}
当然,如果您只想为每50个元素添加此消息,请将Console.WriteLine部分更改为:
if (i%50 == 1) Console.WriteLine("parsing rows " + i + "-" + i+49 + " from " + count + " rows");
但我强烈建议您查看BackgroundWorkers和/或Threads
答案 1 :(得分:1)
这是让你入门的东西。你可以使用代表。
public class FileManeger
{
public Action<string> Trace {get;set;}
public bool ParseFile()
{
// ....stuff
foreach(DataRow row in Rows)
{
// stuff
this.Trace("Send a message like this");
}
}
}
然后在你的主要
FileManager manager = new FileManager();
Console.Writeline("Parsing started...");
manager.Trace = (msg)=>Console.WriteLine(msg);
new Thread(()=>{manager.ParseFile();}).Start();
// Console.Writeline("Parsing Finished."); let the file parser emit this message