StreamReader file = new StreamReader(@"C:\Users\User\Documents\Files.txt");
while ((line = file.ReadLine()) != null)
{
richTextBox1.Text += Environment.NewLine + "Copying: " + line;
counter++;
}
我有这个代码来读取包含多个路径的文本文件。我想做的是将它们发布到我到目前为止的文本框中,但我的问题是我可以在流读取器要发布的每一行之间做1秒的延迟吗?
答案 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
。
答案 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 Method(lines.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。