フッターコンテンツにスキップ
.NETヘルプ

C# Timer(開発者向けの動作方法)

C#のタイマークラスは、指定された間隔でコードを実行するためのスケジュールを立てるための強力なツールです。 Windowsフォームアプリケーションやコンソールアプリを開発する際に、タイマーを使用する方法を理解することで、アプリケーションの機能性を大幅に向上させることができます。 このチュートリアルでは、C#でタイマーを使用する基本を説明し、それらを設定する方法、イベントを処理する方法、およびアプリケーション内でスムーズに動作させる方法を紹介します。 また、C#でのタイマーを使用したPDF生成を自動化するために、IronPDF for Automated PDF Generation in C# Applicationsの使用方法についても説明します。

C#でのタイマークラスの紹介

C#タイマー(開発者向けの動作方法):図1 - タイマークラス

C#には、異なるタスクや環境に適した複数のタイマークラスがあります。 最も一般的に使用されるタイマークラスは、サーバーベースのタイマー用のSystem.Timers.TimerとWindows Formsアプリケーション用のSystem.Windows.Forms.Timerです。 タイマークラスを操作する際には、イベントハンドラーの役割を理解することが重要です。これらのハンドラーは、タイマーが指示する重要な瞬間で行われるアクションを指示します。

新しいタイマーの設定

タイマーの時間間隔を設定することは、タイマーのイベントハンドラーがどのくらい頻繁に呼ばれるかを決定するため、アプリケーションの時間に敏感な機能のリズムを制御するための運用の基盤です。 特にWindows Formsアプリケーションを開発する場合、C#アプリケーションでタイマーを使用するには、ツールボックスからフォームにSystem.Windows.Forms.Timerコンポーネントを追加するか、より柔軟にプログラムでタイマーオブジェクトを作成することから始めます。

var timer = new System.Timers.Timer(); // Create a new timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
var timer = new System.Timers.Timer(); // Create a new timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
Dim timer = New System.Timers.Timer() ' Create a new timer
timer.Interval = 2000 ' Sets the timer interval to tick every 2 seconds
$vbLabelText   $csharpLabel

このシンプルな設定により、2秒ごとにティックするタイマーが作成されます。 ただし、タイマーがアクションを実行するには、それをイベントハンドラーに接続する必要があります。

経過イベントの処理

System.Timers.TimerElapsedイベントに経過イベントハンドラーを添付することで、アプリケーションが各間隔でタスクを実行し、時間ベースのトリガーに効果的に応答できるようになります。 このイベントは、タイマーの間隔が経過するたびに発生します。 このイベントにハンドラーを添付して、タイマーがティックしたときに何が起こるべきかを指定します:

timer.Elapsed += OnTimedEvent;
timer.Elapsed += OnTimedEvent;
timer.Elapsed += OnTimedEvent
$vbLabelText   $csharpLabel

上記のコードでは、OnTimedEventは、タイマーのElapsedイベントがトリガーされるたびに呼び出されるメソッドです。

イベントハンドラーの作成

タイマーのイベントハンドラーを定義する際には、タイマーのティックイベントに応答してメソッドを作成し、予め定義された間隔で実行されるアクションを正確に制御できます。 タイマーのElapsedイベントのイベントハンドラーは通常次のようになります:

static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
}
static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
}
Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
	Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime)
End Sub
$vbLabelText   $csharpLabel

このメソッドは、タイマーがエラーになったときに単に現在の時間をコンソールに出力し、タイマーイベントにどのように応答するかを示します。

タイマーの開始と停止

タイマーとそのイベントハンドラーを設定した後、タイマーを開始する必要があります。 これを行うには、そのEnabledプロパティをtrueに設定するか、Startメソッドを呼び出します:

timer.Enabled = true; // or timer.Start();
timer.Enabled = true; // or timer.Start();
timer.Enabled = True ' or timer.Start();
$vbLabelText   $csharpLabel

タイマーを停止するには、Enabledfalseに設定するか、Stopメソッドを呼び出します。 これは必要のない場合にアプリケーションが不要な操作を実行しないようにするために重要です。

Windows Formsアプリケーションでのタイマーの使用

System.Windows.Forms.Timerは、Windows Formsアプリケーションのイベント駆動モデルとシームレスに統合するように設計された価値あるWindows Formsコンポーネントで、ユーザーインターフェイスの応答性を損なうことなく定期的なアクションを促進します。

例: フォームにタイマーを追加する

Windows Formsアプリケーションでは、ツールボックスからフォームにタイマーコントロールをドラッグするか、次のようにプログラムによって作成できます:

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; // 1 second interval
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; // 1 second interval
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
Dim myTimer As New System.Windows.Forms.Timer()
myTimer.Interval = 1000 ' 1 second interval
AddHandler myTimer.Tick, AddressOf TimerEventProcessor
myTimer.Start()
$vbLabelText   $csharpLabel

ここで、TimerEventProcessorは、System.Timers.TimerElapsedイベントに類似したTickイベントが発生するたびに呼び出されるイベントハンドラーです。

高度なタイマー管理

タイマーのスレッドセーフティ

タイマーを使用する場合は、アプリケーションのスレッドモデルを理解することが重要です。 System.Timers.TimerSystem.Threading.Timerは、スレッドプールスレッド上でコールバックを実行し、並行実行を可能にします。 ただし、コールバックメソッドが共有データを変更したり、ユーザーインターフェイスの要素とやり取りしたりすると、スレッドセーフティの問題が発生する可能性があります。 タイマーのコールバックからUI要素を安全に更新するには、アプリケーションの種類に固有の技術(例:Windows FormsではInvokeBeginInvokeを使用)を使用して、コールをUIスレッドにマーシャリングする必要があります。

高精度タイミング

高精度のタイミングを必要とするアプリケーション(例:マルチメディアアプリケーションやゲーム)には、System.Diagnostics.Stopwatchクラスが、経過時間を高精度で測定するためのタイマーよりも適している場合があります。 ストップウォッチクラスそれ自体はタイマーではありませんが、正確な時間測定を達成するためにタイマーと組み合わせて使用できる。

実用的な例

例: カウントダウンタイマーの実装

タイマーが役立つ一般的なシナリオは、カウントダウンタイマーを作成することです。 これは、一秒(1000ミリ秒)の間隔にタイマーを設定し、タイマーがエラーになるたびにカウンターを減少させることで実現できます。 カウンターがゼロに達すると、カウントダウンの終了を示してタイマーは停止します。

using System;

namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; // Countdown from 10 seconds

        public static void Main(string[] args) // Main method
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }

        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }

        static void UpdateCountdown(Object source, System.Timers.ElapsedEventArgs e)
        {
            if (countdownTime > 0)
            {
                Console.WriteLine(countdownTime-- + " seconds remaining");
            }
            else
            {
                Console.WriteLine("Countdown finished!");
                ((System.Timers.Timer)source).Stop(); // Stop the timer
            }
        }
    }
}
using System;

namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; // Countdown from 10 seconds

        public static void Main(string[] args) // Main method
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }

        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }

        static void UpdateCountdown(Object source, System.Timers.ElapsedEventArgs e)
        {
            if (countdownTime > 0)
            {
                Console.WriteLine(countdownTime-- + " seconds remaining");
            }
            else
            {
                Console.WriteLine("Countdown finished!");
                ((System.Timers.Timer)source).Stop(); // Stop the timer
            }
        }
    }
}
Imports System

Namespace CountdownApp
	Friend Class Program
		Private Shared countdownTime As Integer = 10 ' Countdown from 10 seconds

		Public Shared Sub Main(ByVal args() As String) ' Main method
			StartCountdown()
			Console.ReadLine() ' Prevent console from closing immediately
		End Sub

		Private Shared Sub StartCountdown()
			Dim timer = New System.Timers.Timer(1000) ' Tick every second
			AddHandler timer.Elapsed, AddressOf UpdateCountdown
			timer.Enabled = True
		End Sub

		Private Shared Sub UpdateCountdown(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
			If countdownTime > 0 Then
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Console.WriteLine(countdownTime-- + " seconds remaining");
				Console.WriteLine(countdownTime & " seconds remaining")
				countdownTime -= 1
			Else
				Console.WriteLine("Countdown finished!")
				DirectCast(source, System.Timers.Timer).Stop() ' Stop the timer
			End If
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

上述のコードの出力は以下の通りです:

C#タイマー(開発者向けの動作方法):図2 - カウントダウンタイマー出力

例: 定期的なデータベースチェックのスケジューリング

タイマーは、例えば新しいデータの照会や古いレコードのクリーンアップなど、定期的にデータベースをチェックするために使用できます。 この例では、データベースを1時間ごとに照会するためのタイマーを設定します:

private static void SetupDatabaseCheckTimer()
{
    var timer = new System.Timers.Timer(3600000); // Set to 1 hour
    timer.Elapsed += CheckDatabase;
    timer.Enabled = true;
}

private static void CheckDatabase(Object source, System.Timers.ElapsedEventArgs e)
{
    // Perform database operations here
    Console.WriteLine("Database checked at " + e.SignalTime);
}
private static void SetupDatabaseCheckTimer()
{
    var timer = new System.Timers.Timer(3600000); // Set to 1 hour
    timer.Elapsed += CheckDatabase;
    timer.Enabled = true;
}

private static void CheckDatabase(Object source, System.Timers.ElapsedEventArgs e)
{
    // Perform database operations here
    Console.WriteLine("Database checked at " + e.SignalTime);
}
Private Shared Sub SetupDatabaseCheckTimer()
	Dim timer = New System.Timers.Timer(3600000) ' Set to 1 hour
	AddHandler timer.Elapsed, AddressOf CheckDatabase
	timer.Enabled = True
End Sub

Private Shared Sub CheckDatabase(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
	' Perform database operations here
	Console.WriteLine("Database checked at " & e.SignalTime)
End Sub
$vbLabelText   $csharpLabel

IronPDF の紹介

IronPDF - Easily Generate PDF from HTML and ASPX is particularly praised for its ease of use in generating PDFs from HTML or URLs, essentially allowing your application to "print" any HTMLコンテンツをPDFドキュメントとして「印刷」できるようにします。 これは、レポート、請求書、標準化された形式で提示する必要のあるウェブコンテンツを生成するために非常に便利です。 IronPDFは、生成されたPDFがウェブコンテンツの忠実度を維持するように、CSSスタイル、JavaScript、およびカスタムフォントなどの高度な機能もサポートしています。

IronPDFの顕著な機能は、レイアウトとスタイルを維持するHTMLからPDFへの変換機能です。 ウェブコンテンツからPDFを生成し、レポート、請求書、およびドキュメントには理想的です。 HTMLファイル、URL、およびHTML文字列を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");
    }
}
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

Installing IronPDF

このコマンドを実行してNuGetパッケージマネージャーを使用してIronPDFをインストールできます:

Install-Package IronPdf

日々更新されるデータを含む日次レポートをPDF形式で生成する必要があると仮定します。 簡単のため、基本的なHTMLレポートを生成し、毎24時間ごとにIronPDFを使用してPDFに変換します。 C#アプリケーションでは、毎24時間ごとにトリガーするSystem.Timers.Timerを設定します。 重要なのは、インターバルはミリ秒で設定されるため、24時間は24 * 60 * 60 * 1000ミリ秒を表すことに注意することです。

using System;
using System.Timers;
using IronPdf;
using Timer = System.Timers.Timer;

class Program
{
    static void Main(string[] args)
    {
        // Set up the timer for 24 hours
        Timer timer = new Timer(24 * 60 * 60 * 1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;

        Console.WriteLine("Press Enter to exit the program.");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        GeneratePdfReport();
    }

    private static void GeneratePdfReport()
    {
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>");
        string outputPath = $"f:\\DailyReport_{DateTime.Now:yyyyMMdd}.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"Generated PDF report at {outputPath}");
    }
}
using System;
using System.Timers;
using IronPdf;
using Timer = System.Timers.Timer;

class Program
{
    static void Main(string[] args)
    {
        // Set up the timer for 24 hours
        Timer timer = new Timer(24 * 60 * 60 * 1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;

        Console.WriteLine("Press Enter to exit the program.");
        Console.ReadLine();
    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        GeneratePdfReport();
    }

    private static void GeneratePdfReport()
    {
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>");
        string outputPath = $"f:\\DailyReport_{DateTime.Now:yyyyMMdd}.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"Generated PDF report at {outputPath}");
    }
}
Imports System
Imports System.Timers
Imports IronPdf
Imports Timer = System.Timers.Timer

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Set up the timer for 24 hours
		Dim timer As New Timer(24 * 60 * 60 * 1000)
		AddHandler timer.Elapsed, AddressOf OnTimedEvent
		timer.AutoReset = True
		timer.Enabled = True

		Console.WriteLine("Press Enter to exit the program.")
		Console.ReadLine()
	End Sub

	Private Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
		GeneratePdfReport()
	End Sub

	Private Shared Sub GeneratePdfReport()
		Dim renderer = New HtmlToPdf()
		Dim pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>")
		Dim outputPath As String = $"f:\DailyReport_{DateTime.Now:yyyyMMdd}.pdf"
		pdf.SaveAs(outputPath)
		Console.WriteLine($"Generated PDF report at {outputPath}")
	End Sub
End Class
$vbLabelText   $csharpLabel

出力

コードを実行すると、次の出力がコンソールに表示されます。 ここで私は迅速な出力のためにコードを変更し、10秒タイマーを使用しています。

C#タイマー(開発者向けの動作方法):図3 - コンソール出力

生成されたPDFは以下の通り:

C#タイマー(開発者向けの動作方法):図4 - PDFレポート

結論

C#タイマー(開発者向けの動作方法):図5 - ライセンス

結論として、C#タイマーとIronPDFを統合することで、.NETアプリケーションにおいてPDFドキュメントを自動的に生成および管理する強力なアプローチを提供します。 提供された例を通して、頻繁なテストや定期レポート生成のために、C#タイマーを設定してPDF生成タスクを定期的にトリガーする方法について探検しました。

C#タイマーを使用することで、PDF関連のタスクがスケジュールに基づいて実行されるタイミングを正確に制御でき、定期的な更新、レポートの生成、またはスケジュールされたタスクの実行が可能になります。 IronPDFは、動的コンテンツ、HTML、またはウェブページに基づいてPDFドキュメントを作成、操作、および保存するための簡潔で効率的な方法を提供することで、この機能を強化します。

無料トライアルとライセンス情報を提供するIronPDFには、完全なアクセスとサポートを受けるためのライセンスがあります。 これは.NETアプリケーションに包括的なPDF機能を実装するための費用対効果の高い方法を提供します。

よくある質問

C#で利用可能な主なタイマークラスは何ですか?

C# には System.Timers.Timer のようなサーバー基盤のアプリケーション用タイマーと、Windows Forms アプリケーション用の System.Windows.Forms.Timer などがあり、それぞれ異なるスレッドと実行要件に対応しています。

C#でHTMLをPDFに変換する方法は?

IronPDFのRenderHtmlAsPdfメソッドを使用することで、C#でHTMLをPDFに変換できます。このメソッドはCSSやJavaScriptなどの高度な機能をサポートしており、レポートや請求書の生成に最適です。

C# アプリケーションでタイマーの設定と管理をどのように行いますか?

C# アプリケーションでタイマーを設定するには、タイマークラスのインスタンスを作成し、その間隔を指定し、Elapsed または Tick イベントにイベントハンドラを取り付けることで、定期的にコードを実行できます。

C# アプリケーションでタイマーを使用する利点は何ですか?

C# のタイマーは、定期的なデータベースチェックのスケジューリング、カウントダウンタイマーの実装、およびPDF生成の自動化などのタスクを自動化するのに有用です。

IronPDFはC#でのPDF生成自動化をどのように実現しますか?

IronPDFはC#のタイマーを使ってPDF作成プロセスを定期的にトリガーし、日次報告書や請求書の生成を実現できます。

System.Timers.Timerのスレッド問題をどのように処理しますか?

System.Timers.Timer は、コールバックをスレッドプールスレッドで実行するため、スレッドセーフティに問題が生じる場合があります。適切な管理には、InvokeBeginInvoke などの技術を使用して、UIの更新をUIスレッドに戻すことが含まれます。

C#のタイマーイベントからUIコンポーネントをどのように更新しますか?

C# のタイマーイベントからUIコンポーネントを更新するには、Invoke または BeginInvoke メソッドを使用して、呼び出しをUIスレッドにマーシャリングする必要があります。

タイマーはC#アプリケーションの機能をどのように向上させますか?

タイマーは特定の間隔でタスクをスケジュールすることで、アプリケーションの効率と応答性を向上させる自動化を可能にします。

C# プロジェクトにIronPDFをインストールして使用する方法は?

IronPDFは、NuGet Package Managerを使用してInstall-Package IronPdfというコマンドでC#プロジェクトにインストールできます。インストール後、そのメソッドを使用してHTMLをPDFに変換したり、PDF生成を自動化できます。

C#でタイマーを利用した実用例は何ですか?

C#のタイマーの実用例には、カウントダウンタイマーの実装、定期的なデータベース更新のスケジューリング、IronPDFを使用した日次PDFレポート自動生成があります。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。