StreamReader在一个文本框中发布延迟

本文关键字:延迟 布延迟 一个 StreamReader 文本 | 更新日期: 2023-09-27 18:12:00

StreamReader file = new StreamReader(@"C:'Users'User'Documents'Files.txt");
while ((line = file.ReadLine()) != null)
{
    richTextBox1.Text += Environment.NewLine + "Copying: " + line;
    counter++;
}

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

StreamReader在一个文本框中发布延迟

诸如此类:

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

文档

1)使用System.Windows.Forms.Timer

实现以用户定义的时间间隔引发事件的计时器。这个定时器是为在Windows窗体应用程序中使用而优化的,必须在窗口中使用。

2)读取Queue中的所有行。

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++;
        }
    }

检查是否有空队列。Dequeue方法(lines.Count > 0或其他,当变为true时停止定时器)

你可以使用系统。每次循环迭代调用一次:Thread.Sleep(1000);的线程类。

关于系统的更多信息。MSDN上的线程类

编辑:

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

下面的代码片段假设您想通过单击按钮来触发上面的代码(从问题中不清楚是否实际是这种情况)。

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。