2015-09-08 5 views
0
StreamReader file = new StreamReader(@"C:\Users\User\Documents\Files.txt"); 

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

У меня есть этот код для чтения текстового файла с несколькими путями в нем. То, что я хочу сделать, это опубликовать их в текстовом поле, которое я получил до сих пор, но мой вопрос: могу ли я сделать задержку в 1 секунду между каждой строкой, которую собирается передать streamreader?Запись StreamReader в текстовом поле с задержкой

+0

Sry забыл, что это окна формы – Ayres

+1

'Thread.Sleep (1000);' ...? – sab669

+0

@ sab669 почему предлагают что-то, что просто приведет к «почему мой пользовательский интерфейс заморожен»? –

ответ

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

+0

Я попробую это позже, попробую еще кое-что сделать.Я дам вам некоторую обратную связь, тогда – Ayres

+0

Прекрасно работает, спасибо – Ayres

-1

Вы можете использовать класс System.Threading для вызова: Thread.Sleep(1000); один раз на итерацию цикла.

Более подробная информация о классе System.Threading на MSDN

EDIT:

Как упомянуто ниже, с использованием Thread.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); 
    } 
} 

Здесь вы просто создать рабочий поток, чтобы сделать (относительно) трудоемкую задачу, не связывая свой графический интерфейс.

+0

Как указывает Алексей, это заставит пользовательский интерфейс замерзать на секунду за раз. Если вы не хотите такую ​​функциональность, я предлагаю исследовать класс BackgroundWorker. –

+0

Вы не должны * использовать 'Thread.Sleep' в потоке пользовательского интерфейса. Выполнение этого для потока, отличного от UI, требует гораздо большего количества кода, чем показано в этом сообщении. –

+0

Да, только что выяснилось, что мой ui умирает – Ayres

0

1) Использование System.Windows.Forms.Timer

Реализует таймер, который генерирует событие в определенные пользователем интервалы времени. Этот таймер оптимизирован для использования в приложениях Windows Forms и должен использоваться в окне.

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 или другой, остановить таймер, когда он станет истинным)

Смежные вопросы