使用计时器逐行延迟逐行读取方法C#

时间:2014-02-19 18:08:14

标签: c# printing timer delay sleep

我正在使用Visual Studio 2010使用C#Windows窗体。不要让控制台部分混淆你是用户定义的东西而不是实际的控制台。所以我有一个逐行打印文件的方法。我必须让它看起来慢慢打印所以我目前正在使用Thread.Sleep来逐行打印。我不能使用它,因为它冻结了程序中的一些其他组件。我希望看看是否可以用计时器来完成。虽然我看到与计时器一起使用的所有示例通常都有一个由计时器调用的方法。在方法中间没有定时器延迟。所以我不知道如何在这里使用计时器。


public void SlowPrint(string FileName)
{

    string line;

    string tempFileName;

    string MyFilesDir = "..\\..\\myFolder\\";

    tempFileName = Path.Combine(MyFilesDir, FileName);

    if (System.IO.File.Exists(tempFileName))
    {
        System.IO.StreamReader file = new System.IO.StreamReader(tempFileName);

        while (((line = file.ReadLine()) != null))
        {
            Console.WriteLine(line);
            System.Threading.Thread.Sleep(700);  //This has to go
        }
        file.Close();
    }
    else
    {
        Console.WriteLine("Error " + tempFileName + " does not exists");
    }
    Console.ReadLine();
}//end SlowPrint method

1 个答案:

答案 0 :(得分:1)

等待Task.DelayFile.ReadLines结合使用此操作非常简单:

public async Task SlowPrint(string fileName)
{
    //TODO stuff to generate real file path and check if it exists
    foreach(var line in File.ReadLines(fileName))
    {
        Console.WriteLine(line);
        await Task.Delay(700);
    }
}

预先C#5.0解决方案更难,但肯定是可能的。只需创建一个计时器并在它触发时读取一个新行:

public void SlowPrint(string FileName)
{
    var iterator = File.ReadLines(FileName).GetEnumerator();
    System.Threading.Timer timer = null;
    timer = new System.Threading.Timer(o =>
    {
        if (iterator.MoveNext())
            Console.WriteLine(iterator.Current);
        else
        {
            iterator.Dispose();
            timer.Dispose();
        }
    }, null, 700, Timeout.Infinite);
}