C# Wait For Seconds (開発者向けの仕組み)
プログラミングにおいて、コードの実行を一定時間一時停止または遅延させたいことがあります。これにより、異なる時間条件をシミュレートしたり、特定のタスクを優先したり、メインスレッドをブロックせずに他のタスクを実行したりすることができます。
このガイドでは、C#での待機方法を説明します。非同期メソッド、スリープコマンド、スリープ関数、コンソールアプリ、および私たちの業界をリードするPDF生成ツール、IronPDFでの待機関数の含め方について説明します。
C#でタスクを待つ方法
スリープコマンド
"スリープ"は、現在のタスクの実行を一定時間一時停止するシンプルでありながら強力なコマンドで、次のタスクに進む前にプログラムに待機するよう指示します。 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");
}
}Imports System
Imports System.Threading
Class Program
Public Shared Sub Main()
Console.WriteLine("Starting the program...")
Thread.Sleep(3000) ' Sleep for 3 seconds
Console.WriteLine("...Program continues after 3 seconds")
End Sub
End ClassImports System
Imports System.Threading
Class Program
Public Shared Sub Main()
Console.WriteLine("Starting the program...")
Thread.Sleep(3000) ' Sleep for 3 seconds
Console.WriteLine("...Program continues after 3 seconds")
End Sub
End Classここでは、プログラムはまず"プログラムの開始中..."とコンソールに表示してから、Thread.Sleep メソッドを使って3,000ミリ秒(3秒間)停止します。 指定された遅延後、プログラムは再開し、コンソールに"...プログラムは3秒後に続行します"を出力します。
非同期メソッドとタスク
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 ClassImports 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このコード例では、2つのタスクが同時に実行されています。DoSomethingAsync メソッドはタスクが遅延するべきミリ秒での時間を表す int パラメーターを取ります(コード中の 3000 および 2000 に見られるように、いずれもタイムアウト値です)。 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);
}
}Imports System
Imports System.Timers
Class Program
Public Shared Sub Main()
Dim timer As New Timer(1000) ' Create a timer with a 1-second interval
AddHandler timer.Elapsed, AddressOf OnTimerElapsed
timer.AutoReset = True
timer.Enabled = True
Console.WriteLine("Press any key to exit...")
Console.ReadKey()
End Sub
Private Shared Sub OnTimerElapsed(sender As Object, e As ElapsedEventArgs)
Console.WriteLine("Timer ticked at " & e.SignalTime)
End Sub
End ClassImports System
Imports System.Timers
Class Program
Public Shared Sub Main()
Dim timer As New Timer(1000) ' Create a timer with a 1-second interval
AddHandler timer.Elapsed, AddressOf OnTimerElapsed
timer.AutoReset = True
timer.Enabled = True
Console.WriteLine("Press any key to exit...")
Console.ReadKey()
End Sub
Private Shared Sub OnTimerElapsed(sender As Object, e As ElapsedEventArgs)
Console.WriteLine("Timer ticked at " & e.SignalTime)
End Sub
End Class上記の例では、1秒間隔のタイマーを作成します。 タイマーがチックするたびに 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 ClassImports 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ここで、CustomWaitAsync メソッドはミリ秒単位の遅延時間を表す int パラメーターを受け入れます。 このメソッドは非同期デリゲートを使用して新しいタスク内で Thread.Sleep 関数を実行し、現在のタスク状態が待機中にブロックされますが、メインスレッドはブロックされません。
適切な待機戦略の選択
C#の待ちステートメント、スリープコマンド、非同期メソッド、タイマー、カスタム待機関数をカバーしたので、それぞれの技術をいつ使用するかを知ることが重要です。 以下は簡単な概要です。
- 特定の時間分、コードの実行を一時停止する簡単な方法が必要な時は
Thread.Sleep関数を使用します。 - メインスレッドをブロックせずに複数のタスクを同時に実行する必要がある場合は、非同期メソッドとタスクを使用します。
- 特定の間隔で特定のタスクを実行する必要がある場合は、タイマーを使用します。
- 組み込みメソッドでは満たされない特別な要件がある場合は、カスタム待機関数を作成します。
IronPDFを使った待機関数によるPDF生成
IronPDFは、特にウェブ開発者を念頭に置いて設計された軽量 for .NET PDFライブラリです。 これは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 ClassImports 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 ClassIronPDFは、タスク実行後、スケジュールされた間隔中、または現在のスレッドが実行を再開するときにPDFドキュメントを生成するために、待機戦略とシームレスに統合できます。
たとえば、IronPDFを非同期メソッドと組み合わせて、データベースからデータを取得した後にPDFレポートを生成することができ、メインスレッドをブロックしません。 同様に、タイマークラスを使用してアプリケーションのデータのPDFスナップショットを定期的に作成することもできます。
IronPDFライブラリをインストールする
IronPDFは使用が簡単ですが、インストールするのはさらに簡単です。 これを行う方法はいくつかあります:
方法1:NuGetパッケージマネージャーコンソール
Visual Studioのソリューションエクスプローラーで、参照を右クリックして、NuGetパッケージの管理をクリックします。 ブラウズをクリックして"IronPDF"を検索し、最新バージョンをインストールします。 これを見たら、うまくいっています:

ツール -> NuGetパッケージマネージャ -> パッケージマネージャコンソールに移動し、パッケージマネージャタブで次の行を入力することもできます。
最後に、NuGetの公式ウェブサイトで直接IronPDFを取得することができます。 ページの右側のメニューからパッケージをダウンロードオプションを選択し、ダウンロードをダブルクリックして自動的にインストールし、プロジェクトでの使用を開始するためにソリューションを再読み込みします。
うまくいきませんでしたか? 私たちの高度なNuGetインストールページでプラットフォーム固有のヘルプを見つけることができます。
方法2:DLLファイルを使用
こちらからIronPDF DLLファイルを直接取得して、手動でVisual Studioに追加することもできます。 Windows、MacOS、およびLinux DLLパッケージへのリンクを含む完全な手順については、専用のインストールページをご覧ください。
IronPDF で C# Wait を使用する方法
次の例で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 ClassImports 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ここでは、3秒待ってからPDFを生成するために Task.Delay メソッドを使用します。 その後、PDFはアプリケーションの作業ディレクトリに"HelloWorld.pdf"として保存されます。
そして、これが最終製品です:

IronPDFでの待機メソッドの使用
C#アプリケーションでは、データをDataTableに読み込む、またはIronPDFを使用してPDFレポートを生成するなどの操作を行う際に、スリープ機能を効率的に使用して現在のスレッドとCPUの時間を管理することができます。
結論
最初は直感に反するかもしれませんが、コードに待機ステートメントを実装することは、効率的なアプリケーションを構築するために欠かせないスキルです。 そして、IronPDFを組み込むことで、メインスレッドをブロックせずにPDFドキュメントを即時に作成することで、アプリケーションを次のレベルに引き上げることができます。
IronPDFを体験する準備はできましたか? 30日間の無料トライアルで始めることができます。 開発目的で完全に無料で使用できるので、その真の実力を確かめることができます。 そして、それを気に入ったなら、IronPDFは$999から始まります。 より大きな節約のためには、Iron Suiteをチェックしてください。ここでは、9つのIron Softwareツールを2つの価格で手に入れることができます。 コーディングを楽しんでください!
ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。