跳過到頁腳內容
.NET幫助

C# 等待數秒(開發者的工作原理)

在程式設計中,有時候你會希望暫停或延遲程式碼的執行一段時間。這是為了模擬不同的時間條件、優先處理某些任務、執行其他任務而不阻塞主線程等等。

在本指南中,我們會解釋如何在 C# 中等待,包括非同步方法、睡眠命令、睡眠函數、控制台應用程式,以及如何在我們行業領先的 PDF 生成工具 IronPDF 中包含等待功能。

如何在 C# 中等待任務

睡眠命令

'Sleep'是一個簡單而強大的命令,允許你暫停當前任務的執行一段特定時間,基本上告訴你的程式在繼續下一個任務之前等待。 在 C# 中,我們通過使用 Thread.Sleep(int milliseconds) 方法來做到這一點,如以下代碼示例所示:

using System;
using System.Threading;

class Program
{
    public static void Main()
    {
        Console.WriteLine("Starting the program...");
        Thread.Sleep(3000); // Sleep for 3 seconds
        Console.WriteLine("...Program continues after 3 seconds");
    }
}
using System;
using System.Threading;

class Program
{
    public static void Main()
    {
        Console.WriteLine("Starting the program...");
        Thread.Sleep(3000); // Sleep for 3 seconds
        Console.WriteLine("...Program continues after 3 seconds");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

在這裡,程式開始時在控制台上打印"Starting the program...",然後使用Thread.Sleep方法暫停 3,000 毫秒(或三秒)。 在指定的延遲時間後,程式繼續執行,並在控制台上打印"...Program continues after 3 seconds"。

非同步方法和任務

C# 中的非同步方法使你可以同時執行多個任務而不干擾主線程。 這意味著在一個任務等待的同時,其他任務可以繼續運行。 要實現非同步方法,你需要使用 async 關鍵字和 Task 類。

using System;
using System.Threading.Tasks;

class Program
{
   public static async Task Main()
   {
       Console.WriteLine("Starting Task 1...");
       var task1 = DoSomethingAsync(3000);
       Console.WriteLine("Starting Task 2...");
       var task2 = DoSomethingAsync(2000);

       await Task.WhenAll(task1, task2);
       Console.WriteLine("Both tasks completed.");
   }

   private static async Task DoSomethingAsync(int milliseconds)
   {
       await Task.Delay(milliseconds); // Asynchronously wait without blocking the main thread
       Console.WriteLine($"Task completed after {milliseconds} milliseconds");
   }
}
using System;
using System.Threading.Tasks;

class Program
{
   public static async Task Main()
   {
       Console.WriteLine("Starting Task 1...");
       var task1 = DoSomethingAsync(3000);
       Console.WriteLine("Starting Task 2...");
       var task2 = DoSomethingAsync(2000);

       await Task.WhenAll(task1, task2);
       Console.WriteLine("Both tasks completed.");
   }

   private static async Task DoSomethingAsync(int milliseconds)
   {
       await Task.Delay(milliseconds); // Asynchronously wait without blocking the main thread
       Console.WriteLine($"Task completed after {milliseconds} milliseconds");
   }
}
Imports System
Imports System.Threading.Tasks

Friend Class Program
   Public Shared Async Function Main() As Task
	   Console.WriteLine("Starting Task 1...")
	   Dim task1 = DoSomethingAsync(3000)
	   Console.WriteLine("Starting Task 2...")
	   Dim task2 = DoSomethingAsync(2000)

	   Await Task.WhenAll(task1, task2)
	   Console.WriteLine("Both tasks completed.")
   End Function

   Private Shared Async Function DoSomethingAsync(ByVal milliseconds As Integer) As Task
	   Await Task.Delay(milliseconds) ' Asynchronously wait without blocking the main thread
	   Console.WriteLine($"Task completed after {milliseconds} milliseconds")
   End Function
End Class
$vbLabelText   $csharpLabel

在此代碼示例中,我們有兩個任務同時運行。DoSomethingAsync 方法接收一個int 參數,表示任務應延遲的時間(如代碼中的30002000,都是一個超時值)。 Task.Delay 方法類似於 Thread.Sleep() 方法,但它適用於非同步任務,且不會阻塞主線程。

使用計時器來安排你的任務

C# 中的計時器使你可以在特定時間間隔後執行特定的任務。 你可以使用 System.Timers.Timer 類來創建計時器。 以下是如何在控制台應用程式中使用計時器的示例:

using System;
using System.Timers;

class Program
{
   public static void Main()
   {
       var timer = new Timer(1000); // Create a timer with a 1-second interval
       timer.Elapsed += OnTimerElapsed;
       timer.AutoReset = true;
       timer.Enabled = true;

       Console.WriteLine("Press any key to exit...");
       Console.ReadKey();
   }

   private static void OnTimerElapsed(object sender, ElapsedEventArgs e)
   {
       Console.WriteLine("Timer ticked at " + e.SignalTime);
   }
}
using System;
using System.Timers;

class Program
{
   public static void Main()
   {
       var timer = new Timer(1000); // Create a timer with a 1-second interval
       timer.Elapsed += OnTimerElapsed;
       timer.AutoReset = true;
       timer.Enabled = true;

       Console.WriteLine("Press any key to exit...");
       Console.ReadKey();
   }

   private static void OnTimerElapsed(object sender, ElapsedEventArgs e)
   {
       Console.WriteLine("Timer ticked at " + e.SignalTime);
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

在上面的示例中,我們創建了一個間隔為一秒的計時器。 OnTimerElapsed 方法在每次計時器滴答時執行。 我們將 AutoReset 屬性設置為 true,使計時器在每次滴答後自動重啟。 Enabled 屬性設置為 true 以啟動計時器。

當你運行這個控制台應用程式時,你會看到計時器每秒滴答一次,並將滴答時間打印到控制台上。 這個程式將繼續運行,直到你按下任何鍵退出。

創建自定義的等待功能

有時候,你可能需要一個自定義的等待功能來滿足代碼中的特定需求。 例如,你可能想創建一個只阻塞當前任務的等待功能,而不是整個線程。 你可以使用非同步委託來實現這一點。

以下是自定義等待功能的示例:

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
   public static async Task Main()
   {
       Console.WriteLine("Starting Task 1...");
       await CustomWaitAsync(3000);
       Console.WriteLine("Task 1 completed.");

       Console.WriteLine("Starting Task 2...");
       await CustomWaitAsync(2000);
       Console.WriteLine("Task 2 completed.");
   }

   private static async Task CustomWaitAsync(int milliseconds)
   {
       await Task.Run(() => Thread.Sleep(milliseconds)); // Run in a separate task to avoid blocking the main thread
   }
}
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
   public static async Task Main()
   {
       Console.WriteLine("Starting Task 1...");
       await CustomWaitAsync(3000);
       Console.WriteLine("Task 1 completed.");

       Console.WriteLine("Starting Task 2...");
       await CustomWaitAsync(2000);
       Console.WriteLine("Task 2 completed.");
   }

   private static async Task CustomWaitAsync(int milliseconds)
   {
       await Task.Run(() => Thread.Sleep(milliseconds)); // Run in a separate task to avoid blocking the main thread
   }
}
Imports System
Imports System.Threading
Imports System.Threading.Tasks

Friend Class Program
   Public Shared Async Function Main() As Task
	   Console.WriteLine("Starting Task 1...")
	   Await CustomWaitAsync(3000)
	   Console.WriteLine("Task 1 completed.")

	   Console.WriteLine("Starting Task 2...")
	   Await CustomWaitAsync(2000)
	   Console.WriteLine("Task 2 completed.")
   End Function

   Private Shared Async Function CustomWaitAsync(ByVal milliseconds As Integer) As Task
	   Await Task.Run(Sub() Thread.Sleep(milliseconds)) ' Run in a separate task to avoid blocking the main thread
   End Function
End Class
$vbLabelText   $csharpLabel

在這裡,CustomWaitAsync 方法接收一個代表以毫秒為單位的延遲時間的int參數。 該方法使用非同步委託在一個新任務中運行Thread.Sleep函數,確保當前任務狀態在等待時被阻塞,但不阻礙主線程。

選擇正確的等待策略

現在我們已經涵蓋了 C# 中的等待語句、睡眠命令、非同步方法、計時器和自定義等待功能,了解何時使用每種技術至關重要。 以下是一個簡要總結:

  • 當你需要簡單地暫停代碼執行的一段指定時間時,使用 Thread.Sleep 函數。
  • 當你需要同時執行多個任務而不阻止主線程時,使用非同步方法和任務。
  • 當你需要在指定時間間隔執行某一特定任務時,使用計時器。
  • 當內置方法不能滿足你的特定要求時,創建自定義等待功能。

使用等待功能生成 PDF 以及 IronPDF

IronPDF 是一款輕量級 .NET PDF 庫,專為 web 開發者設計。 它使讀取、寫入和操作 PDF 文件變得簡單,可以將各種類型的文件轉換為 PDF 內容,您可以將其用於桌面和網頁的 .NET 專案中。 最好的部分 - 在開發環境中試用是免費的。 讓我們開始吧。

IronPDF 可處理 HTML 文件、URL、原始字符串和 ZIP 文件。 以下是代碼的快速概覽:

using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();

       // 1. Convert HTML String to PDF
       var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
       var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
       pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

       // 2. Convert HTML File to PDF
       var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
       var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
       pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

       // 3. Convert URL to PDF
       var url = "http://ironpdf.com"; // Specify the URL
       var pdfFromUrl = renderer.RenderUrlAsPdf(url);
       pdfFromUrl.SaveAs("URLToPDF.pdf");
   }
}
using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();

       // 1. Convert HTML String to PDF
       var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
       var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
       pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

       // 2. Convert HTML File to PDF
       var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
       var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
       pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

       // 3. Convert URL to PDF
       var url = "http://ironpdf.com"; // Specify the URL
       var pdfFromUrl = renderer.RenderUrlAsPdf(url);
       pdfFromUrl.SaveAs("URLToPDF.pdf");
   }
}
Imports IronPdf

Friend Class Program
   Shared Sub Main(ByVal args() As String)
	   Dim renderer = New ChromePdfRenderer()

	   ' 1. Convert HTML String to PDF
	   Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
	   Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
	   pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

	   ' 2. Convert HTML File to PDF
	   Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
	   Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
	   pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

	   ' 3. Convert URL to PDF
	   Dim url = "http://ironpdf.com" ' Specify the URL
	   Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
	   pdfFromUrl.SaveAs("URLToPDF.pdf")
   End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 可以無縫集成你的等待策略,以在執行任務、安排的時間間隔後或當前線程恢復執行時生成 PDF 文檔。

例如,你可以將 IronPDF 與非同步方法結合使用,在從數據庫中獲取資料後生成 PDF 報告,而不阻塞主線程。 同樣,你可以使用計時器類在規定的時間間隔內建立應用程式數據的 PDF 快照。

安裝 IronPDF 標簽庫

IronPDF 使用簡便,安裝更加容易。 有幾種方法可以安裝:

方法 1:NuGet 套件管理控制台

在 Visual Studio 中,於方案管理器上右鍵單擊 參考,然後點擊 管理 NuGet 套件。 點擊瀏覽並搜索 'IronPDF',然後安裝最新版本。 如果你看到這個,表示它在運行:

Csharp Wait For Seconds 1 related to 方法 1:NuGet 套件管理控制台

你也可以前往工具 -> NuGet 套件管理器 -> 套件管理器控制台,並在套件管理器頁籤輸入以下行:

Install-Package IronPdf

最後,你可以從 NuGet 的官方網站 直接獲取 IronPDF。 從頁面右側選單選擇下載套件選項,雙擊你的下載來自動安裝,然後重新載入方案以在你的項目中開始使用它。

沒有效果? 你可以在我們的高級NuGet安裝頁面上找到特定平台的幫助。

方法 2:使用 DLL 文件

你還可以直接從我們這裡獲取 IronPDF DLL 文件並手動添加到 Visual Studio 中。 有關完整的指導和 Windows、MacOS 和 Linux DLL 套件的鏈接,請查看我們的專用安裝頁面

如何在 IronPDF 中使用 C# 等待

你可以在以下示例中看到如何在 IronPDF 中包含等待功能:

using System;
using System.Threading.Tasks;
using System.Diagnostics;
using IronPdf;

class Program
{
   public static async Task Main()
   {
       Console.WriteLine("Starting the PDF generation task...");
       Stopwatch stopwatch = Stopwatch.StartNew();
       await Task.Delay(3000); // Wait for 3 seconds
       GeneratePdf();
       Console.WriteLine("PDF generated successfully.");
   }

   private static void GeneratePdf()
   {
       var htmlToPdf = new ChromePdfRenderer();
       var pdf = htmlToPdf.RenderHtmlAsPdf("<h1>Hello, World!</h1>");
       pdf.SaveAs("HelloWorld.pdf");
   }
}
using System;
using System.Threading.Tasks;
using System.Diagnostics;
using IronPdf;

class Program
{
   public static async Task Main()
   {
       Console.WriteLine("Starting the PDF generation task...");
       Stopwatch stopwatch = Stopwatch.StartNew();
       await Task.Delay(3000); // Wait for 3 seconds
       GeneratePdf();
       Console.WriteLine("PDF generated successfully.");
   }

   private static void GeneratePdf()
   {
       var htmlToPdf = new ChromePdfRenderer();
       var pdf = htmlToPdf.RenderHtmlAsPdf("<h1>Hello, World!</h1>");
       pdf.SaveAs("HelloWorld.pdf");
   }
}
Imports System
Imports System.Threading.Tasks
Imports System.Diagnostics
Imports IronPdf

Friend Class Program
   Public Shared Async Function Main() As Task
	   Console.WriteLine("Starting the PDF generation task...")
	   Dim stopwatch As Stopwatch = System.Diagnostics.Stopwatch.StartNew()
	   Await Task.Delay(3000) ' Wait for 3 seconds
	   GeneratePdf()
	   Console.WriteLine("PDF generated successfully.")
   End Function

   Private Shared Sub GeneratePdf()
	   Dim htmlToPdf = New ChromePdfRenderer()
	   Dim pdf = htmlToPdf.RenderHtmlAsPdf("<h1>Hello, World!</h1>")
	   pdf.SaveAs("HelloWorld.pdf")
   End Sub
End Class
$vbLabelText   $csharpLabel

在這裡,我們使用 Task.Delay 方法等待 3 秒,然後生成 PDF。 PDF 然後以"HelloWorld.pdf"的名稱保存在應用程序的工作目錄中,一旦等待完成。

這是最終產品:

Csharp Wait For Seconds 2 related to 如何在 IronPDF 中使用 C# 等待

使用等待方法與 IronPDF

在 C# 應用程式中,你可以有效地使用睡眠功能來管理當前線程和 CPU 時間,從而在執行諸如將數據加載到 DataTable 或使用 IronPDF 生成 PDF 報告等操作時提高效率。

結論

一開始可能看起來不合直觀,但將等待語句加入代碼是建立高效率應用程序時的必備技能。 通過集成 IronPDF,你可以在不阻塞主線程的情況下即時生成 PDF 文檔,進一步提升你的應用程序。

準備好試用 IronPDF 嗎? 您可以從我們的30 天免費試用開始。 它的開發用途完全免費,因此您可以真正看到它的作用。 如果你喜歡看到的結果,IronPDF 起價僅為 $799。 如果想獲得更多折扣,請查看 Iron Suite,你可以享受以兩種工具的價格獲得九種 Iron Software 工具。 祝您編程愉快!

Csharp Wait For Seconds 3 related to 結論

常見問題解答

如何在 C# 中延遲 PDF 渲染?

在 C# 中,您可以使用 `Thread.Sleep` 方法來同步等待,或使用 `Task.Delay` 來進行異步等待。這些方法允許您暫停代碼執行指定時間,確保任務在正確的時間執行。

C# 中的 WaitFor 類別是什麼?

C# 中的 WaitFor 類別用於在代碼中實現各種等待策略。它提供了像 `Thread.Sleep` 和 `Task.Delay` 這樣的方法來幫助管理任務執行時間,使開發人員能夠根據需要暫停代碼執行。

如何在 C# 中實現 PDF 任務的異步等待?

在 C# 中可以使用 `Task.Delay` 方法來實現異步等待,這樣可以在不阻塞主執行緒的情況下進行等待。這對於 PDF 任務尤為有用,以確保平滑的執行和適當的任務調度。

計時器在 C# 中的任務執行管理中扮演什麼角色?

計時器,如 `System.Timers.Timer` 類別提供的那些,允許您在特定間隔預定任務。它們在需定期執行任務(如 PDF 生成)時非常有用,確保高效的任務管理,而不會阻塞主執行緒。

可以在 C# 中創建自定義等待函數嗎?

是的,您可以使用異步委託在 C# 中創建自定義等待函數。這樣可以滿足特定需求的代碼執行暫停,特別是在預設的等待方法不夠時。

如何在 C# 中將 PDF 生成與等待策略整合?

您可以透過使用異步方法和計時器在 C# 中將 PDF 生成與等待策略整合。這確保 PDF 創建任務得以高效管理,允許時間表安排的執行而不擋住其他進程。

在 C# 中如何將 HTML 轉換為 PDF?

在 C# 中要將 HTML 轉換為 PDF,您可以使用像 IronPDF 這樣的庫。此庫提供將 HTML 字符串、URL 和文件高效轉換為 PDF 文件的方法。

使用 C# 中的異步方法有什麼好處?

C# 中的異步方法提供並發任務執行的好處,通過允許多個任務並行執行而不阻塞主執行緒來提高應用程序效率。

如何在 .NET 專案中安裝 PDF 庫?

要在 .NET 專案中安裝 PDF 庫,您可以使用 Visual Studio 中的 NuGet 包管理器來搜索並安裝該庫。或者,您也可以下載該庫的 DLL 文件並手動添加到項目中。

在 C# 中是否有可能暫停 PDF 渲染的特定時間?

是的,您可以在 C# 中使用 `Thread.Sleep` 方法來進行同步暫停,或使用 `Task.Delay` 方法來進行異步暫停,這樣可以控制 PDF 生成任務的時機。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。