StreamReader在文本框中发布有延迟

时间:2015-09-08 20:00:46

标签: c# winforms textbox streamreader

StreamReader file = new StreamReader(@"C:\Users\User\Documents\Files.txt");

while ((line = file.ReadLine()) != null)
{
    richTextBox1.Text += Environment.NewLine + "Copying: " + line;
    counter++;
}

我有这个代码来读取包含多个路径的文本文件。我想做的是将它们发布到我到目前为止的文本框中,但我的问题是我可以在流读取器要发布的每一行之间做1秒的延迟吗?

3 个答案:

答案 0 :(得分:1)

这类事:

System.Threading.ThreadPool.QueueUserWorkItem((obj) =>
{
    StreamReader file = new StreamReader(@"C:\Users\User\Documents\Files.txt");
    string line;
    int counter = 0;
    while ((line = file.ReadLine()) != null)
    {
        this.Invoke((Action)(() =>
            {
                richTextBox1.Text += Environment.NewLine + "Copying: " + line;
            }));
        System.Threading.Thread.Sleep(1000);
        counter++;
    }
});

或者如上面评论中所建议的那样,也可以使用BackgroundWorker

Documentation

答案 1 :(得分:0)

1)使用System.Windows.Forms.Timer

实现以用户定义的间隔引发事件的计时器。此计时器已针对Windows窗体应用程序进行了优化,必须在窗口中使用。

2)读取队列中的所有行。

Queue<string> lines = new Queue<string>( File.ReadAllLines( @"Path" ) );

3)使用计时器事件来读取列表中的每一行。

private void Timer_Tick( object sender, EventArgs e )
    {
        if ( lines.Count > 0 )
        {
            richTextBox1.Text += Environment.NewLine + "Copying: " + lines.Dequeue();
            counter++;
        }
    }

检查空Queue.Dequeue Methodlines.Count > 0或其他,当它成为真时停止计时器)

答案 2 :(得分:-1)

您可以使用System.Threading类在每次循环迭代时调用Thread.Sleep(1000);一次。

有关MSDN

上的System.Threading类的更多信息

编辑:

如下所述,使用Thread.Sleep会导致UI在Sleep方法期间锁定。作为替代方案,您可以尝试BackgroundWorker class.

以下代码段假设您希望通过单击按钮触发上面的代码(从问题是否确实是这样的情况还不清楚。)

private void startAsyncButton_Click(object sender, EventArgs e)
{
   if(backgroundWorkerA.IsBusy != true)
   {
      //start the Async Thread
      backgroundWorkerA.RunWorkerAsync();
   }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   StreamReader file = new StreamReader(@"C:\Users\User\Documents\Files.txt");

   while ((line = file.ReadLine()) != null)
   {
       richTextBox1.Text += Environment.NewLine + "Copying: " + line;
       counter++;
       Thread.Sleep(1000);
   }
}

在这里,您只需创建一个工作线程即可完成(相对)耗时的任务,而无需占用您的GUI。