2014-02-19 5 views
0

Я использую C# Windows Forms с помощью Visual Studio 2010. Не позволяйте компоненту Console путать вас, это определенная пользователем вещь, а не фактическая консоль. Поэтому у меня есть метод, который печатает файл по строкам. Я должен заставить его отображаться медленно, так что в настоящее время я использую Thread.Sleep, чтобы замедлить печать строки за строкой. Я не могу использовать это, потому что он замораживает некоторые другие компоненты в программе. Я надеялся увидеть, можно ли это сделать с помощью таймера. Хотя все примеры, которые, как я вижу, используются с таймером, обычно имеют метод, вызываемый таймером. В середине метода нет задержки таймера. Поэтому я не уверен, как я могу использовать таймер здесь.Использование таймера для задержки метода линии строки по строке C#


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 
+0

попробовать 'ждут Task.Delay (700),' –

+0

Если это действительно WinForms то вы, вероятно, не хотят, чтобы держать приложение в заложниках петля со сном посредине (независимо от того, как достигается этот «сон»). Переместите StreamReader на уровень класса, чтобы он мог получить доступ к событию Timer Tick(). Таким образом, вы можете лучше взаимодействовать с пользовательским взаимодействием и отменить «цикл», если это необходимо. –

ответ

1

Task.Delay в ожидании делает эту операцию довольно легко, в сочетании с File.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); 
} 
+0

Я думаю, что я где-то читал, что Task.Delay не работает с Visual Studio 2010, который является тем, что я использую ... – user3003304

+0

@ user3003304 Я добавил более старое решение, которое вы можете использовать. – Servy

+0

Мне нравится это решение. Спасибо за предоставление как старого, так и старого решения. – user3003304

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