2014-02-19 27 views
0

我正在使用C#Windows窗體使用Visual Studio 2010.不要讓控制檯部分混淆你這是用戶定義的事情而不是實際的控制檯。所以我有一個逐行打印文件的方法。我必須使它看起來慢慢打印,所以我目前使用Thread.Sleep來逐行減速打印。我無法使用它,因爲它凍結了程序中的其他組件。我希望看到這是否可以用計時器來完成。雖然我看到所有用於定時器的例子通常都有一個被定時器調用的方法。在方法中間沒有計時器延遲。所以我不確定在這裏如何使用計時器。使用計時器來逐行延遲readline方法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移出到Class級別,以便可以通過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