.NET ヘルプ

Hangfire .NET Core(開発者向けの動作方法)

公開済み 2024年1月14日
共有:

現代のアプリケーション開発では、大規模なタスクを処理するためにバックグラウンドタスクを処理する必要があります。このようなシナリオでは、バックグラウンドジョブハンドラーを使用して複数のジョブを実行する必要があります。 C# .NET Coreアプリケーションのための多くのジョブハンドラーがありますが、その一つにバックグラウンドの親ジョブハンドラーであるHangfireがあります。このブログでは、Hangfireのバックグラウンドジョブについて学び、他のパッケージとどのように使用するかについて説明します。PDF生成のためのIronPDFバックグラウンドでPDFドキュメントを生成するために。

イントロダクション

ハングファイアASP.NET Core または .NET Core 6 Web API アプリケーションにおいて、バックグラウンド処理の実装を簡素化するために、バックグラウンドジョブの管理と実行において信頼性が高く、柔軟なフレームワークを提供します。 HangfireはNuGetパッケージであり、次のように .NET CLI を使用してインストールできます。

dotnet add package Hangfire --version 1.8.6

.NET Core Web API での実装

Hangfireについて学ぶために、簡単な.NET Core APIアプリケーションを作成し、CLIを使用してHangfireをインストールしましょう。

dotnet new webapi -n HangfireDemo
cd HangfireDemo
dotnet build
dotnet add package Hangfire --version 1.8.6
dotnet build

ここでは .NET CLI を使用して簡単な天気 REST API を作成しています。 最初の行は、HangfireDemo という名前の Core Web API プロジェクトを作成します。(また、ASP.NET Coreを作成することもできます)APIエンドポイントを実行するために。 2行目は、新しく作成したフォルダー "HangfireDemo" に移動し、プロジェクトをビルドするためのものです。 次に、Hangfire NuGet パッケージをプロジェクトに追加し、再度ビルドしました。 その後、お好みのエディター、Visual Studio 2022 または JetBrains Rider でプロジェクトを開くことができます。 プロジェクトを実行すると、以下のようにSwaggerを見ることができます。

Hangfire .NET Core(開発者向けの動作方法): 図1 - Swagger

ここでは、日付、概要、および温度を返す天気のGET APIを確認できます。

Hangfire .NET Core(開発者向けの動作方法):図2 - Weather GET API

では、Hangfire バックグラウンドジョブプロセッサを追加しましょう。 Visual Studioでプロジェクトを開く。

Hangfire ジョブ プロセッサーを追加

アプリケーション内でHangfireを設定します。これは通常、Startup.csファイル内で行われます。これにはジョブストレージの設定とHangfireサーバーの初期化が含まれます。

// Startup.cs
using Hangfire;
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Hangfire services
        services.AddHangfire(config => config.UseSqlServerStorage("your_connection_string"));
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Configure Hangfire
        app.UseHangfireServer();
        app.UseHangfireDashboard();
        // Your other configuration settings
    }
}
// Startup.cs
using Hangfire;
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Hangfire services
        services.AddHangfire(config => config.UseSqlServerStorage("your_connection_string"));
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Configure Hangfire
        app.UseHangfireServer();
        app.UseHangfireDashboard();
        // Your other configuration settings
    }
}
' Startup.cs
Imports Hangfire
Public Class Startup
	Public Sub ConfigureServices(ByVal services As IServiceCollection)
		' Add Hangfire services
		services.AddHangfire(Function(config) config.UseSqlServerStorage("your_connection_string"))
	End Sub
	Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IHostingEnvironment)
		' Configure Hangfire
		app.UseHangfireServer()
		app.UseHangfireDashboard()
		' Your other configuration settings
	End Sub
End Class
VB   C#

ConfigureServicesは、Hangfireの新しく作成されたジョブを保存するためのストレージを追加するために使用されます。 ここではSQL Serverデータベースが使用されています。 SQL Serverの接続文字列は"your_connection_string"に置き換えてください。 インメモリストレージは、Hangfire.InMemoryを使用して行うこともできます。

dotnet add package Hangfire.InMemory --version 0.6.0

置き換える

services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });
services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });
services.AddHangfire(Sub(configuration)
	configuration.UseInMemoryStorage()
End Sub)
VB   C#

バックグラウンド ジョブを作成する

バックグラウンドジョブとして実行したいメソッドを定義します。 これらのメソッドは、引数なしのコンストラクタを持つクラスの静的メソッドまたはインスタンスメソッドである必要があります。 ジョブは定期的なジョブとして実行することも、多くのジョブを実行することもできます。

public class MyBackgroundJob
{
    public void ProcessJob()
    {
        // Your background job logic, recurring job or multiple jobs
        Console.WriteLine("Background job is running...");
    }
}
public class MyBackgroundJob
{
    public void ProcessJob()
    {
        // Your background job logic, recurring job or multiple jobs
        Console.WriteLine("Background job is running...");
    }
}
Public Class MyBackgroundJob
	Public Sub ProcessJob()
		' Your background job logic, recurring job or multiple jobs
		Console.WriteLine("Background job is running...")
	End Sub
End Class
VB   C#

ジョブをキューに追加

Hangfire API を使用してバックグラウンドジョブをエンキューします。 特定の時間、遅延後、または定期的にバックグラウンドジョブをスケジュールして実行することができます。

// Enqueue a job to run immediately
BackgroundJob.Enqueue<MyBackgroundJob>(x => x.ProcessJob());
// Schedule a job to run after 5 min delay, delayed job
BackgroundJob.Schedule<MyBackgroundJob>(x => x.ProcessJob(), TimeSpan.FromMinutes(5));
// Schedule a recurring job / recurring jobs using job Id
RecurringJob.AddOrUpdate<MyBackgroundJob>("job Id", x => x.ProcessJob(), Cron.Daily);
// Enqueue a job to run immediately
BackgroundJob.Enqueue<MyBackgroundJob>(x => x.ProcessJob());
// Schedule a job to run after 5 min delay, delayed job
BackgroundJob.Schedule<MyBackgroundJob>(x => x.ProcessJob(), TimeSpan.FromMinutes(5));
// Schedule a recurring job / recurring jobs using job Id
RecurringJob.AddOrUpdate<MyBackgroundJob>("job Id", x => x.ProcessJob(), Cron.Daily);
' Enqueue a job to run immediately
BackgroundJob.Enqueue(Of MyBackgroundJob)(Function(x) x.ProcessJob())
' Schedule a job to run after 5 min delay, delayed job
BackgroundJob.Schedule(Of MyBackgroundJob)(Function(x) x.ProcessJob(), TimeSpan.FromMinutes(5))
' Schedule a recurring job / recurring jobs using job Id
RecurringJob.AddOrUpdate(Of MyBackgroundJob)("job Id", Function(x) x.ProcessJob(), Cron.Daily)
VB   C#

ハングファイアダッシュボードとサーバー

Hangfireのダッシュボードとサーバーは、Configureメソッドに追加できます。

// Run Hangfire server
app.UseHangfireServer();
app.UseHangfireDashboard();
// Run Hangfire server
app.UseHangfireServer();
app.UseHangfireDashboard();
' Run Hangfire server
app.UseHangfireServer()
app.UseHangfireDashboard()
VB   C#

サーバーは、ConfigureServices にも追加できます。

services.AddHangfireServer();
services.AddHangfireServer();
services.AddHangfireServer()
VB   C#

ファイア・アンド・フォーゲット・ジョブズ

//Fire and forget job / Fire and forget jobs are executed only once and almost immediately after creation.
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!")); //jobId for Fire and forget job
//Fire and forget job / Fire and forget jobs are executed only once and almost immediately after creation.
var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!")); //jobId for Fire and forget job
'Fire and forget job / Fire and forget jobs are executed only once and almost immediately after creation.
Dim jobId = BackgroundJob.Enqueue(Sub() Console.WriteLine("Fire-and-forget!")) 'jobId for Fire and forget job
VB   C#

定期ジョブ

//Recurring jobs fire many times on the specified CRON schedule.
RecurringJob.AddOrUpdate( "myrecurringjob",() => Console.WriteLine("Recurring!"),Cron.Daily);
//Recurring jobs fire many times on the specified CRON schedule.
RecurringJob.AddOrUpdate( "myrecurringjob",() => Console.WriteLine("Recurring!"),Cron.Daily);
'Recurring jobs fire many times on the specified CRON schedule.
RecurringJob.AddOrUpdate("myrecurringjob",Sub() Console.WriteLine("Recurring!"),Cron.Daily)
VB   C#

遅延ジョブ

//Delayed jobs are executed only once too, but not immediately, after a certain specific interval.
var jobId = BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"),
    TimeSpan.FromDays(7));
//Delayed jobs are executed only once too, but not immediately, after a certain specific interval.
var jobId = BackgroundJob.Schedule(() => Console.WriteLine("Delayed!"),
    TimeSpan.FromDays(7));
'Delayed jobs are executed only once too, but not immediately, after a certain specific interval.
Dim jobId = BackgroundJob.Schedule(Sub() Console.WriteLine("Delayed!"), TimeSpan.FromDays(7))
VB   C#

連続

//Continuation jobs are executed when its parent job has been finished, immediate child job
BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!"));
//Continuation jobs are executed when its parent job has been finished, immediate child job
BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!"));
'Continuation jobs are executed when its parent job has been finished, immediate child job
BackgroundJob.ContinueJobWith(jobId,Sub() Console.WriteLine("Continuation!"))
VB   C#

バッチジョブ

//Batch is a group of background jobs that is created atomically and considered as a single entity. Two jobs can be run as below.
var batchId = BatchJob.StartNew(x =>
{
    x.Enqueue(() => Console.WriteLine("Job 1"));
    x.Enqueue(() => Console.WriteLine("Job 2"));
});
//Batch is a group of background jobs that is created atomically and considered as a single entity. Two jobs can be run as below.
var batchId = BatchJob.StartNew(x =>
{
    x.Enqueue(() => Console.WriteLine("Job 1"));
    x.Enqueue(() => Console.WriteLine("Job 2"));
});
'Batch is a group of background jobs that is created atomically and considered as a single entity. Two jobs can be run as below.
Dim batchId = BatchJob.StartNew(Sub(x)
	x.Enqueue(Sub() Console.WriteLine("Job 1"))
	x.Enqueue(Sub() Console.WriteLine("Job 2"))
End Sub)
VB   C#

バッチ継続ジョブ

Batch continuation is fired when all background jobs in a parent batch are finished.
BatchJob.ContinueBatchWith(batchId, x =>
{
    x.Enqueue(() => Console.WriteLine("Last Job"));
});
Batch continuation is fired when all background jobs in a parent batch are finished.
BatchJob.ContinueBatchWith(batchId, x =>
{
    x.Enqueue(() => Console.WriteLine("Last Job"));
});
Dim tempVar As Boolean = TypeOf continuation Is fired
Dim [when] As fired = If(tempVar, CType(continuation, fired), Nothing)
Batch tempVar all background jobs in a parent batch are finished.BatchJob.ContinueBatchWith(batchId, Sub(x)
	x.Enqueue(Sub() Console.WriteLine("Last Job"))
End Sub)
VB   C#

ダッシュボード

Hangfire Dashboardでは、バックグラウンドジョブに関するすべての情報を見つけることができます。 それはOWINミドルウェアとして書かれています。(もし、OWINに詳しくない場合も心配しないでください。)以下のコンテンツを日本語に翻訳します:

あなたのASP.NET、ASP.NET MVC、Nancy、およびServiceStackアプリケーションにそのまま組み込んで使用することができます。また、OWINセルフホストコンソールアプリケーションまたはWindowsサービス内でダッシュボードをホストする機能。

ダッシュボードがビューに有効になっている場合、ダッシュボードは /hangfire/ 拡張にあります。 このダッシュボードでは、バックグラウンド実行ジョブの管理、バックグラウンドジョブのスケジュール設定、ファイア・アンド・フォーゲットジョブの表示、および定期的なジョブの表示が可能です。 ジョブIDを使用してジョブを識別できます。

ライブ処理

Hangfire .NET Core(開発者向けの仕組み):図3 - ジョブのライブ処理

成功したジョブ

以下に成功したジョブが表示されます。

Hangfire .NET Core(開発者のための仕組み):図 4 - 成功したジョブ

スケジュールされたジョブ

ハングファイア .NET Core(開発者向け動作原理):図5 - スケジュールされたジョブ

既に設定された構成に基づいて、あなたのアプリケーションが実行されると、Hangfireがバックグラウンドジョブの処理を行います。

より高度な設定オプションや機能については、Hangfireのドキュメントを確認してください:Hangfireドキュメントおよび完全なコードはで見つけることができますGitHub Hangfireデモ.

IronPDFの紹介

IronPDF for .NET PDFジェネレーションですNuGet パッケージ からIronソフトウェアのPDFライブラリPDFドキュメントの読み取りと生成をサポートします。 それは、スタイル情報を持つフォーマット済みのドキュメントを簡単にPDFに変換できます。 IronPDFはHTMLコンテンツから簡単にPDFを生成することができます。 それは、URLからHTMLをダウンロードして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
VB   C#

IronPDFを始めましょう

今日から無料トライアルでIronPDFをあなたのプロジェクトで使い始めましょう。

最初のステップ:
green arrow pointer


IronPDFライブラリのインストール

NuGet パッケージマネージャーを使用してインストール

Hangfire .NET プロジェクトに IronPDF を統合するために、NuGet パッケージ マネージャーを使用する手順は次のとおりです:

  1. Visual Studioを開き、ソリューションエクスプローラーでプロジェクトを右クリックします。

  2. コンテキストメニューから「NuGetパッケージの管理...」を選択してください。

  3. 「参照」タブに移動して、「IronPDF」を検索してください。

  4. 検索結果からIronPDFライブラリを選択し、インストールボタンをクリックします。

  5. ライセンス契約のプロンプトをすべて受け入れます。

    プロジェクトにIronPDFをパッケージ マネージャー コンソール経由で含めたい場合は、パッケージ マネージャー コンソールで以下のコマンドを実行してください:

Install-Package IronPdf

それは、プロジェクトにIronPDFを取得してインストールします。

NuGetウェブサイトを使用してインストール

IronPDFの機能、互換性、その他のダウンロードオプションに関する詳細な概要については、NuGetウェブサイトのIronPDFページ https://www.nuget.org/packages/IronPdf をご覧ください。

DLLを使ってインストール

代わりに、IronPDFのdllファイルをプロジェクトに直接組み込むことができます。DLLを含むZIPファイルを次のリンクからダウンロードしてくださいIronPDF 直接ダウンロード. 解凍して、プロジェクトにDLLを含めてください。

今度は、HTTPリクエストパイプラインのウェブサイトをPDFファイルとしてダウンロードするためのバックグラウンド処理ジョブを追加するようにアプリケーションを修正しましょう。

namespace HangfireDemo.Core;
public class PdfGenerationJob
{
    public void Start(string website)
    {
        // Create a PDF from any existing web page
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument pdf = renderer.RenderUrlAsPdf(website);
        var filePath = AppContext.BaseDirectory + "result.pdf";
        pdf.SaveAs(filePath);
    }
}
namespace HangfireDemo.Core;
public class PdfGenerationJob
{
    public void Start(string website)
    {
        // Create a PDF from any existing web page
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument pdf = renderer.RenderUrlAsPdf(website);
        var filePath = AppContext.BaseDirectory + "result.pdf";
        pdf.SaveAs(filePath);
    }
}
Namespace HangfireDemo.Core
	Public Class PdfGenerationJob
		Public Sub Start(ByVal website As String)
			' Create a PDF from any existing web page
			Dim renderer As New ChromePdfRenderer()
			Dim pdf As PdfDocument = renderer.RenderUrlAsPdf(website)
			Dim filePath = AppContext.BaseDirectory & "result.pdf"
			pdf.SaveAs(filePath)
		End Sub
	End Class
End Namespace
VB   C#

IronPDFには、URLからウェブサイトをダウンロードし、PDFドキュメントとして保存するための組み込みメソッドがあります。 このメソッドを使用して、ジョブの一環としてダウンロードし、一時的な場所に保存します。 このバックグラウンドジョブは、複数のウェブサイトURLを取り込み、PDFとして保存するように変更できます。

次に、PDF生成とダウンロードAPIを公開するためのコントローラーを追加します。

using Hangfire;
using HangfireDemo.Core;
using Microsoft.AspNetCore.Mvc;
namespace HangfireDemo.Controllers;
[ApiController]
[Route("[controller]")]
public class PdfGeneratorController : ControllerBase
{
    [HttpGet("request", Name = "Start PDF Generation")]
    public void Start([FromQuery] string websiteUrl)
    {
        BackgroundJob.Enqueue<PdfGenerationJob>(x => x.Start(websiteUrl));
    }
    [HttpGet("result", Name = "Download PDF Generation")]
    public IActionResult WebResult()
    {
        var filePath = AppContext.BaseDirectory + "result.pdf";
        var stream = new FileStream(filePath, FileMode.Open);
       return new FileStreamResult(stream, "application/octet-stream") { FileDownloadName = "website.pdf" };
    }
}
using Hangfire;
using HangfireDemo.Core;
using Microsoft.AspNetCore.Mvc;
namespace HangfireDemo.Controllers;
[ApiController]
[Route("[controller]")]
public class PdfGeneratorController : ControllerBase
{
    [HttpGet("request", Name = "Start PDF Generation")]
    public void Start([FromQuery] string websiteUrl)
    {
        BackgroundJob.Enqueue<PdfGenerationJob>(x => x.Start(websiteUrl));
    }
    [HttpGet("result", Name = "Download PDF Generation")]
    public IActionResult WebResult()
    {
        var filePath = AppContext.BaseDirectory + "result.pdf";
        var stream = new FileStream(filePath, FileMode.Open);
       return new FileStreamResult(stream, "application/octet-stream") { FileDownloadName = "website.pdf" };
    }
}
Imports Hangfire
Imports HangfireDemo.Core
Imports Microsoft.AspNetCore.Mvc
Namespace HangfireDemo.Controllers
	<ApiController>
	<Route("[controller]")>
	Public Class PdfGeneratorController
		Inherits ControllerBase

		<HttpGet("request", Name := "Start PDF Generation")>
		Public Sub Start(<FromQuery> ByVal websiteUrl As String)
			BackgroundJob.Enqueue(Of PdfGenerationJob)(Function(x) x.Start(websiteUrl))
		End Sub
		<HttpGet("result", Name := "Download PDF Generation")>
		Public Function WebResult() As IActionResult
			Dim filePath = AppContext.BaseDirectory & "result.pdf"
			Dim stream = New FileStream(filePath, FileMode.Open)
		   Return New FileStreamResult(stream, "application/octet-stream") With {.FileDownloadName = "website.pdf"}
		End Function
	End Class
End Namespace
VB   C#

以下に、ウェブサイトのURLを取得して、ダウンロードを開始するためのバックグラウンドジョブを開始するためのAPIを2つ作成しました。 別のAPIは、PDFの結果をダウンロードするためのものです。 APIの例は以下のようになります。

Hangfire .NET Core(開発者向け機能説明):図7 - PDFGenerator API

結果は以下のようになります。

ハングファイア .NET Core(開発者のための動作仕組み):図8 - 出力

ライセンス(無料トライアル利用可能)

上記のコードを透かしなしで動作させるには、ライセンスキーが必要です。 開発者は、次のサイトに登録すると、トライアルライセンスを利用できます。IronPdf 無料トライアル. トライアルライセンスにクレジットカードは必要ありません。 あなたの電子メールIDを提供し、無料トライアルに登録することができます。

結論

HangfireとIronPDFを組み合わせることで、バックグラウンドでPDFを生成およびダウンロードすることができます。 ハングファイアをさまざまなプログラミングパラダイムで使用して、長時間実行されるタスクを処理することができます。 IronPDFは、柔軟で使いやすいPDF生成ソリューションを提供します。 IronPDFについて詳しく知りたい場合は、ドキュメントを参照してください。IronPDF ドキュメント.

また、他のツールについてもご覧いただけますIron Software製品スイートこれにより、コーディングスキルを向上させ、最新のアプリケーション要件を満たすことができます。

< 以前
C#のNull合体演算子(開発者向けの仕組み)
次へ >
C# キュー(開発者向けの仕組み)