.NET ヘルプ

C# タイマー(開発者向けの仕組み)

イントロダクション

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

C#のタイマークラスの導入

C# タイマー(開発者向けの仕組み):図1 - タイマークラス

C#にはさまざまなタイマークラスがあり、それぞれ異なる作業や環境に適しています。 最も一般的に使用されるタイマークラスは、サーバーベースのタイマー用のSystem.Timers.Timerと、Windows Formsアプリケーション用のSystem.Windows.Forms.Timerです。 タイマークラスを使用する際には、イベントハンドラの役割を理解することが重要です。これらのハンドラは、タイマーによって指定された各重要な瞬間、例えば、ティックや経過時間のイベント間隔で実行されるアクションを決定します。

新しいタイマーの設定

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

var timer = new System.Timers.Timer(); // use a timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
var timer = new System.Timers.Timer(); // use a timer
timer.Interval = 2000; // Sets the timer interval to tick every 2 seconds
Dim timer = New System.Timers.Timer() ' use a 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フォームアプリケーションでタイマーを使用する

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
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; // 1 second
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
Dim myTimer As New System.Windows.Forms.Timer()
myTimer.Interval = 1000 ' 1 second
AddHandler myTimer.Tick, AddressOf TimerEventProcessor
myTimer.Start()
$vbLabelText   $csharpLabel

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

高度なタイマー管理

タイマーを使用したスレッドセーフティ

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

高精度タイミング

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

実用的な例

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

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

using System;
namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; // Countdown from 10 seconds
// public static void main
        public static void Main(string [] args)
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }
        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second, var timer
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }
// public static void printtimes
        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
        public static void Main(string [] args)
        {
            StartCountdown();
            Console.ReadLine(); // Prevent console from closing immediately
        }
        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); // Tick every second, var timer
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }
// public static void printtimes
        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 static void main
		Public Shared Sub Main(ByVal args() As String)
			StartCountdown()
			Console.ReadLine() ' Prevent console from closing immediately
		End Sub
		Private Shared Sub StartCountdown()
			Dim timer = New System.Timers.Timer(1000) ' Tick every second, var timer
			AddHandler timer.Elapsed, AddressOf UpdateCountdown
			timer.Enabled = True
		End Sub
' public static void printtimes
		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 - HTMLとASPXから簡単にPDFを生成 は、HTMLやURLからPDFを生成する際の使いやすさで特に高く評価されています。これにより、アプリケーションは本質的にHTMLコンテンツをPDFドキュメントとして「印刷」できます。 レポート、請求書、標準化された形式で提示する必要があるウェブコンテンツの生成に非常に役立ちます。 IronPDFは、CSSスタイル、JavaScript、カスタムフォントなどの高度な機能にも対応しており、生成されたPDFがウェブコンテンツの忠実性を保持することを保証します。

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

IronPDFのインストール

NuGet パッケージマネージャーを使用して IronPDF をインストールするには、次のコマンドを実行します:

Install-Package IronPdf

毎日更新されるデータを含むPDF形式の日報を生成する必要があると想像してください。 簡単のために、基本的なHTMLレポートを生成し、IronPDFを使用して毎日24時間ごとにPDFに変換します。 お客様のC#アプリケーションでは、System.Timers.Timerを設定して24時間ごとにトリガーするようにします。 間隔はミリ秒で設定されているため、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 ドキュメントの生成と管理を自動化するための強力なアプローチです。 提供された例を通じて、PDF生成タスクを定期的にトリガーするためにC#のタイマーを設定する方法を検討しました。これには、頻繁なテスト目的やスケジュールされたレポート生成が含まれます。

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

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

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
GraphQL C#(開発者向けの動作方法)
次へ >
Math.Round C#(開発者向けの利用方法)