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

C# ConfigureAwait(開発者向けの仕組み)

開発者として、非同期プログラミングは非常に有益です。アプリケーションのパフォーマンス、効率、および応答性を向上させることができます。特に、完了するのに予測不可能な時間がかかる操作を扱う場合に効果的です。 ConfigureAwait(false)を使用することで、特定のシナリオでデッドロックを回避できます。 デッドロックは、同期コンテキスト(デスクトップアプリケーションのUIスレッドなど)が操作の完了を待っているときに発生します。 それでも、待機しているタスクは同期コンテキストの開放を待っており、循環待ちが発生します。

本日は、ConfigureAwaitをIronPDFと組み合わせることで、非同期プログラミングを活用して効率的にPDF処理タスクを実行する方法を検討します。 IronPDFは、PDF関連のタスクを楽にする.NETのPDFライブラリです。 充実した機能セット、強力なクロスプラットフォーム互換性、そして豊富なドキュメントを備えているため、開発者のツールキットに強力なPDFツールを持つことができます。

C#における非同期プログラミングの理解

非同期プログラミングとは何でしょうか?

非同期プログラミングとは、メインアプリケーションのスレッドと独立して特定の操作を実行できるコードの記述方法を指します。 これは、I/O操作などの待機が必要な長時間実行されるタスクに役立ちます。 これらのタスクがメインスレッドをブロックせずに実行できるようにすることで、アプリケーションはこれらのタスクが完了するまで実行を続けることができ、最終的にはアプリケーションのパフォーマンスと応答性を向上させます。

非同期コードにおけるConfigureAwaitの役割

ConfigureAwaitは、非同期プログラミングで継続がどのように実行されるかを制御するために使用されるメソッドです。 継続とは、待機式の後に実行されるコードのことで、デフォルトではawaitは現在のコンテキストをキャプチャし、そのコンテキストに継続を再利用しようとしますが、これが効果的でないことがあります。ConfigureAwaitは、継続がキャプチャされたコンテキストで実行されるべきかどうかを指定できます。キャプチャされるとConfigureAwait(true)、されないとConfigureAwait(false)となります。

ConfigureAwait(false)を使用することはデッドロックを回避するのに役立ちます。これは、現在の同期コンテキストをキャプチャしない設定をするためで、元のコンテキストに復帰することを試みません。 これにより、継続が元のコンテキストではなくスレッドプールのスレッドで実行され、メインスレッドがブロックされるのを防ぎます。

ConfigureAwait(false)は特にライブラリコードや、元のコンテキストに戻る必要のないケースで有用であり、コードが柔軟でデッドロックが発生しないことを保証します。

IronPDFでのConfigureAwaitの使用方法

.NETプロジェクトでのIronPDFの設定

.NETプロジェクトでIronPDFを使用開始するには、IronPDF NuGetパッケージをインストールして開始します。 これは、[ツール > NuGetパッケージマネージャ > ソリューションのNuGetパッケージマネージャ]に移動してIronPDFを検索することで行うことができます。

C# ConfigureAwait (How It Works For Developers): 図1

または、Package Manager Consoleで次のコマンドを実行することもできます。

Install-Package IronPdf

IronPDFをコードで使用し始めるには、コードファイルの先頭にusing IronPdf;を配置したことを確認してください。IronPDFを環境にセットアップするためのより包括的なガイドについては、getting startedページを参照してください。

IronPDFを使用した非同期PDFの生成

大容量のPDFファイルを生成する必要がある場合や複数の操作を同時に実行したい場合、PDFファイルを非同期で生成することは特に有益です。 IronPDFを使用することで、非同期でPDF関連のタスクを実行できます。これは次のような非同期コードになる場合があります:

using IronPdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await GeneratePdfAsync();
    }

    static async Task GeneratePdfAsync()
    {
        // Create a new instance of ChromePdfRenderer.
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Example HTML content to be converted into a PDF.
        string htmlContent = "<h1>Hello World!</h1>";

        // Asynchronously render the HTML content as a PDF document.
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Asynchronously save the PDF document to a file.
        await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));

        Console.WriteLine("Working!");
    }
}
using IronPdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await GeneratePdfAsync();
    }

    static async Task GeneratePdfAsync()
    {
        // Create a new instance of ChromePdfRenderer.
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Example HTML content to be converted into a PDF.
        string htmlContent = "<h1>Hello World!</h1>";

        // Asynchronously render the HTML content as a PDF document.
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Asynchronously save the PDF document to a file.
        await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));

        Console.WriteLine("Working!");
    }
}
$vbLabelText   $csharpLabel

このコードでは、GeneratePdfAsync()メソッドでPDFドキュメントを非同期に作成しています。 ChromePdfRendererがHTMLコンテンツからPDFファイルを作成するためのレンダラーを作成するために使用されます。 PdfDocumentクラスは、提供されたHTMLストリングからPDFを作成するために使用されますが、HTMLファイルURL画像などからPDFを作成することもできます。 IronPDFでPDFを生成するさまざまな方法については、PDF生成のhow-toセクションを確認してください。

大容量PDFファイルを非同期で処理する

大容量のPDFファイルを扱う際には、ConfigureAwait(false)を使用する非同期メソッドを使用することで、長時間の操作中にメインスレッドを解放し、パフォーマンスを大幅に向上させることができます。 この例では、大容量のPDFドキュメントを取り扱い、テキスト抽出タスクを実行して、非同期PDF処理の有益性を示します。

using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;

class Program
{
    static async Task Main(string[] args)
    {
        await LongPdfTask();
    }

    static async Task LongPdfTask()
    {
        try
        {
            // Initialize IronPDF's PdfDocument asynchronously.
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);

            // Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
            string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);

            // Write the extracted text to a file asynchronously.
            await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);

            Console.WriteLine("Extraction complete!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in LongPdfTask: {ex.Message}");
        }
    }
}
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;

class Program
{
    static async Task Main(string[] args)
    {
        await LongPdfTask();
    }

    static async Task LongPdfTask()
    {
        try
        {
            // Initialize IronPDF's PdfDocument asynchronously.
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);

            // Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
            string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);

            // Write the extracted text to a file asynchronously.
            await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);

            Console.WriteLine("Extraction complete!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in LongPdfTask: {ex.Message}");
        }
    }
}
$vbLabelText   $csharpLabel

上記のコードでは、200ページを超える大容量のPDFファイルからすべてのテキストを抽出する大規模で時間のかかるタスク中に、ConfigureAwait(false)が使用されます。

  • インポートとセットアップ: コードの先頭セクションは、必要なライブラリと名前空間のインポートに専念しています。 IronPDFライブラリを使用するには、using IronPdf;が必要です。
  • クラスとメインメソッド: class Programは、このプロジェクトの主要なアプリケーションコードを含むクラスを定義します。 static async Task Main(string[] args)はアプリケーションのエントリーポイントです。 ここでは、非同期操作がその中から実行できるようにasyncとしてマークしました。 その後、await LongPdfTask()を使用して、LongPdfTaskメソッドを非同期に呼び出します。
  • Tryブロック: Unexpectedな例外を上手に処理するために、LongPdfTaskメソッド内のコードをtry-catchブロックでラップしました。

  • PdfDocument PDF = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false) : この行は次の3つのセグメントに分けられます:

  • PdfDocument.FromFile("Sample.pdf"): ここでは、指定されたPDFファイルをIronPDF.PdfDocumentオブジェクトに同期的にロードします。

    • await Task.Run(() => ...): PDFの読み込み操作を別のスレッドで実行し、メインスレッドをブロックしないようにします。 これを非同期操作とします。
    • .ConfigureAwait(false): 現在のコンテキストのキャプチャを避け、パフォーマンスを向上させ、デッドロックを減少させます。
  • string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false): これはIronPDFテキスト抽出メソッド、ExtractAllText()を実行します。 再び、await Task.Run(() => ...)を使用して、この操作を別のスレッドで非同期に実行します。
  • await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false): これにより、再びawait Taskメソッドを使用して、抽出されたテキストを.txtファイルに非同期で書き込みます。

C# ConfigureAwait (How It Works For Developers): 図2

出力

C# ConfigureAwait (How It Works For Developers): 図3

.NETアプリケーションでのConfigureAwaitの使用のベストプラクティス

ConfigureAwait(true)対 ConfigureAwait(false)を使用するタイミング

ConfigureAwait(false)は、ライブラリコードやバックグラウンド処理をしているときに、同期コンテキストを維持する必要がない場合に最適です。 通常、これはサーバーサイドコードでパフォーマンスが重要な場合に使用します。 ConfigureAwait(false)を使用すると、await操作が終了したときに、継続が必ずしも非同期操作を開始したスレッドで実行されません。

PDF処理に関しては、ConfigureAwait(false)を実装することで、コンテキストの切り替えによるボトルネックを回避し、複数のPDF処理タスクを実行する際のパフォーマンスを最大化するのに役立ちます。 また、コンソールアプリケーションやバックグラウンドサービスで作業をしている場合に、コンテキストの切り替えが不要になる状況でも、アプリケーションの効率を維持するのに役立ちます。

ConfigureAwait(true)はUI環境や単体テスト時に最適ですが、不適切だとデッドロックを招く可能性があります。 たとえば、UIの更新やhttpcontextへのアクセスを行う場合などで使用されます。 ConfigureAwait(true)はデフォルトの動作で、そのままConfigureAwaitと書くこともできます。

PDF処理タスクで使用する場合、UIとしっかり統合されたケース(WPF, WinFormsなどのUIアプリケーションを使用する際)で、同期コンテキストをキャプチャしてこれらの更新がUIスレッドで起こることを確認する必要がある時に特に有益です。 特定のスレッドで実行されなければならないスレッド関連の操作においても有益です。

非同期IronPDF操作における例外処理

非同期プログラミングでの例外処理は重要な点であり、慎重な考慮が必要です。未捕捉の例外はアプリケーションを停止させる可能性があります。 非同期コードの周りにtry-catchブロックを配置することは、予期しない例外をうまく処理するための良い方法です。

例えば:

public async Task SafeGeneratePdfAsync()
{
    try
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Asynchronously render HTML as PDF and do not capture the context
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);

        // Asynchronously save PDF to file
        await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
public async Task SafeGeneratePdfAsync()
{
    try
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Asynchronously render HTML as PDF and do not capture the context
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);

        // Asynchronously save PDF to file
        await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
$vbLabelText   $csharpLabel

ConfigureAwait(false)を使用した継続タスクを使用する際には、try-catch以内で例外を処理するか、Task.ContinueWithを使用している場合は、Task.Exceptionプロパティで処理することができます。

このようなコードを記述する例としては次のようになります:

class Program
{
    public static async Task Main(string[] args)
    {
        await ProcessPdfWithContinuationAsync();
    }

    static Task ProcessPdfWithContinuationAsync()
    {
        return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
            .ContinueWith(pdfTask =>
            {
                if (pdfTask.IsFaulted)
                {
                    // Handle exceptions from loading the PDF
                    Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
                    return;
                }
                var pdf = pdfTask.Result;
                // Extract text asynchronously with exception handling
                Task.Run(() => pdf.ExtractAllText())
                    .ContinueWith(extractTask =>
                    {
                        if (extractTask.IsFaulted)
                        {
                            // Handle exceptions from extracting text
                            Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
                            return;
                        }
                        // Proceed if text extraction is successful
                        Console.WriteLine("Extracted text:");
                        Console.WriteLine(extractTask.Result);
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
    }
}
class Program
{
    public static async Task Main(string[] args)
    {
        await ProcessPdfWithContinuationAsync();
    }

    static Task ProcessPdfWithContinuationAsync()
    {
        return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
            .ContinueWith(pdfTask =>
            {
                if (pdfTask.IsFaulted)
                {
                    // Handle exceptions from loading the PDF
                    Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
                    return;
                }
                var pdf = pdfTask.Result;
                // Extract text asynchronously with exception handling
                Task.Run(() => pdf.ExtractAllText())
                    .ContinueWith(extractTask =>
                    {
                        if (extractTask.IsFaulted)
                        {
                            // Handle exceptions from extracting text
                            Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
                            return;
                        }
                        // Proceed if text extraction is successful
                        Console.WriteLine("Extracted text:");
                        Console.WriteLine(extractTask.Result);
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
    }
}
$vbLabelText   $csharpLabel

IronPDFをPDF処理ニーズに選ぶ理由

IronPDFの重要機能と利点

C# ConfigureAwait (How It Works For Developers): 図4

IronPDFは、すべてのPDF関連タスクに対して豊富な機能セットを提供する強力なC# PDFライブラリです。 .NET 8, 7, 6, .NET Core, Standard, Frameworkをフルサポートし、Windows, Linux, Mac, Docker, Azure, AWSなど、さまざまなアプリ環境で実行できますので、IronPDFを希望する環境で最大限に利用することができます。

IronPDFを使用すると、さまざまなファイルおよびデータタイプからPDFを生成できます。HTMLファイルHTML文字列URL画像DOCXRTFなど、わずか数行のコードで! PDFドキュメントのフォーマットを処理し、カスタム透かしを適用し、PDFの結合や分割を行い、PDFの暗号化セキュリティを処理できます。

非同期プログラミングに対するIronPDFのサポート

IronPDFは多くの操作に対して非同期メソッドを提供し、開発者がシームレスにasync/awaitパターンを活用できるようにしています。 このサポートにより、パフォーマンスが重要なアプリケーションにIronPDFを組み込んで応答性を損なうことなく統合でき、非同期の環境でPDF関連のタスクを実行する開発者にとって非常に価値のあるPDFツールになります。

ライセンス

IronPDF の機能を自分で試して、その幅広い機能を探求したい場合は、無料トライアル期間のおかげで簡単に実行できます。 インストールが簡単で迅速なので、PDFプロジェクトでIronPDFをすぐに使い始めることができます。さらにその強力な機能を活用してPDFを向上させたい方は? ライセンスは$liteLicenseから始まり、30日間の返金保証、1年間の製品サポートとアップデート、そして永久ライセンス(煩わしい定期料金なし!)が付いてきます。

C# ConfigureAwait (How It Works For Developers): 図5

例: PDF生成用のConfigureAwaitとIronPDFの使用

PDFを非同期で生成するには、IronPDFを使用してHTMLファイルをレンダリングするコードを実行し、結果を保存します。この際、ConfigureAwait(false)を使用して継続が不要に元の同期コンテキストに切り替わらないようにします。

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

class Program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }

    static async Task<string> CreateInvoicePdfAsync()
    {
        // Instance of ChromePdfRenderer to convert HTML to PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            // Render HTML file as a PDF asynchronously without capturing the context.
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);

            // Save the generated PDF asynchronously.
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);

            return "invoice.pdf";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
using IronPdf;
using System.Threading.Tasks;
using System;

class Program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }

    static async Task<string> CreateInvoicePdfAsync()
    {
        // Instance of ChromePdfRenderer to convert HTML to PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            // Render HTML file as a PDF asynchronously without capturing the context.
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);

            // Save the generated PDF asynchronously.
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);

            return "invoice.pdf";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
$vbLabelText   $csharpLabel

この例では、作成した非同期メソッド、static async TaskCreateInvoicePdfAsync()を使用して、RenderHtmlFileAsPdfAsyncメソッドで提供されたHTMLファイルからPDF請求書を生成します。 タスクの継続が不必要に元の同期コンテキストに戻るのを防ぐためにConfigureAwait(false)を使用し、非UIアプリケーションのパフォーマンスを改善しています。

また、await Task.Run()) => ...)メソッドを再び使用して、操作を非同期で実行しています。 最後に、新たに生成されたPDFファイルをpdf.SaveAsメソッドを使用して"invoice.pdf"として保存しました。 CreateInvoicePdfAsync()メソッド内のすべてのコードは、予期しない例外を処理するためにtry-catchブロックにラップされています。

HTMLファイル

C# ConfigureAwait (How It Works For Developers): 図6

出力

C# ConfigureAwait (How It Works For Developers): 図7

ご覧の通り、HTMLファイルを非同期でPDFに無事変換し、きれいで高品質なPDFファイルが生成されました。

結論

非同期プログラミングは、応答性が高く効率的な.NETアプリケーションの構築に不可欠であり、ConfigureAwaitを正しく使用することでアプリケーションレベルのコードのパフォーマンスを最適化できます。 IronPDFを使用する際には、非同期のメソッドとConfigureAwait(false)を組み合わせて使用することで、PDF処理タスクがメインスレッドをブロックせずに応答性を向上させることができます。 ConfigureAwaitの使用時期と使用方法を理解することで、IronPDFのPDF処理タスクをより堅牢でパフォーマンスに優れたものにできます。

これで、非同期プログラミングにおいて、ConfigureAwaitをIronPDFと共に活用するプロとしての技術を身に付けたわけですが、何を待っていますか? IronPDFを試して、PDF関連のプロジェクトをどのように向上させることができるか確認してください! IronPDFの多機能性を持つ一般的なライブラリコードとしての詳細な情報を知りたい場合は、便利なhow-toガイドをチェックしてください。 また、非同期プログラミング手法と共にIronPDFを使用する方法やIronPDF一般に関する詳細な情報を知りたい場合は、私たちのブログ記事をチェックしてください。 もしより多くの非同期PDF生成の例を探しているなら、C# Wait For Seconds投稿や、他のC# Task.Run投稿を見てください。

よくある質問

非同期プログラミングにおけるConfigureAwaitとは何ですか?

ConfigureAwaitは、非同期プログラミングでawait式の後に続く処理が元の同期コンテキストで実行されるか、異なるコンテキストで実行されるかを指定するためのメソッドです。ConfigureAwait(false)を使用することで、同期コンテキストをキャプチャしないため、デッドロックを回避することができます。

C#で非同期にPDFを生成するにはどうすればいいですか?

C#でPDFを非同期に生成するには、IronPDFの非同期メソッドを使用できます。これにより、大きなファイルを処理する際にも、メインアプリケーションスレッドをブロックせずに効率と応答性を向上させることができます。

C#アプリケーションでConfigureAwait(false)を使用する理由は何ですか?

C#アプリケーションでConfigureAwait(false)を使用することで、継続処理がスレッドプールスレッドで実行されることを許可し、不要なコンテキスト切り替えや潜在的なデッドロックを回避できます。特にライブラリコードでの使用が推奨されます。

.NETでのPDF処理にIronPDFを使用する利点は何ですか?

IronPDFは、PDF生成、テキスト抽出、およびマージなどの豊富な機能を提供し、優れたクロスプラットフォーム互換性があります。非同期プログラミングをサポートしているため、パフォーマンスが重要なアプリケーションに適しています。

非同期PDF処理タスクで例外をどのように処理できますか?

非同期PDF処理タスクの例外は、非同期メソッドの周りにtry-catchブロックを使用して管理できます。IronPDFでは例外を上手に処理し、アプリケーションの安定性を確保できます。

IronPDFを使用したPDF処理では、非同期メソッドがどのように改善されますか?

IronPDFの非同期メソッドを使用すると、メインアプリケーションスレッドをブロックせずにPDF処理タスクを実行できます。これにより、大規模または複雑なPDF操作においてアプリケーションの応答性と効率が向上します。

ライブラリコードでConfigureAwaitを使用する際の重要な留意点は何ですか?

ライブラリコードでConfigureAwaitを使用する際には、ConfigureAwait(false)を使用して同期コンテキストをキャプチャしないようにし、パフォーマンスを向上させ、非同期操作でのデッドロックを防ぐことが重要です。

C#プロジェクトにIronPDFをセットアップするにはどうすればいいですか?

C#プロジェクトにIronPDFをセットアップするには、NuGetパッケージマネージャーを使用してIronPDFを検索するか、パッケージマネージャーコンソールでInstall-Package IronPdfコマンドを実行します。

IronPDFが開発者にとって価値あるツールである理由は何ですか?

IronPDFは、PDF生成、テキスト抽出、暗号化などの強力な機能セットを提供しており、非同期処理をサポートしているため、開発者が応答性と効率の高いアプリケーションを作成するのに役立ちます。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

Jacob Mellorは、Iron Softwareの最高技術責任者であり、C# PDF技術の開拓者としてその先進的な役割を担っています。Iron Softwareのコアコードベースのオリジナルデベロッパーである彼は、創業時から製品のアーキテクチャを形作り、CEOのCameron Rimingtonと協力してNASA、Tesla、全世界の政府機関を含む50人以上の会社に成長させました。

Jacobは、1998年から2001年にかけてマンチェスター大学で土木工学の第一級優等学士号(BEng)を取得しました。1999年にロンドンで最初のソフトウェアビジネスを立ち上げ、2005年には最初の.NETコンポーネントを作成し、Microsoftエコシステムにおける複雑な問題の解決を専門にしました。

彼の旗艦製品であるIronPDFとIronSuite .NETライブラリは、全世界で3000万以上のNuGetインストールを達成しており、彼の基本コードが世界中で使用されている開発者ツールを支えています。商業的な経験を25年間積み、コードを書くことを41年間続けるJacobは、企業向けのC#、Java、およびPython PDF技術の革新を推進し続け、次世代の技術リーダーを指導しています。