<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oleksandr Viktor</title>
    <description>The latest articles on DEV Community by Oleksandr Viktor (@ukrguru).</description>
    <link>https://dev.to/ukrguru</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2645949%2Fc57b0952-c7b2-4419-b654-d898c8c54abf.jpg</url>
      <title>DEV Community: Oleksandr Viktor</title>
      <link>https://dev.to/ukrguru</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ukrguru"/>
    <language>en</language>
    <item>
      <title>🚀 Running Background Jobs in Blazor WASM with WJb (No Backend Required)</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Mon, 01 Jun 2026 11:55:42 +0000</pubDate>
      <link>https://dev.to/ukrguru/running-background-jobs-in-blazor-wasm-with-wjb-no-backend-required-1o18</link>
      <guid>https://dev.to/ukrguru/running-background-jobs-in-blazor-wasm-with-wjb-no-backend-required-1o18</guid>
      <description>&lt;h1&gt;
  
  
  🚀 Running Background Jobs in Blazor WASM with WJb (No Backend Required)
&lt;/h1&gt;

&lt;p&gt;Background processing usually implies servers, queues, workers… and complexity.&lt;/p&gt;

&lt;p&gt;But what if you could run &lt;strong&gt;job processing entirely in the browser&lt;/strong&gt; — with tracking, retries, and cancellation — using a clean API?&lt;/p&gt;

&lt;p&gt;That’s exactly what &lt;strong&gt;WJb&lt;/strong&gt; enables.&lt;/p&gt;

&lt;p&gt;In this article, I’ll show a simple but powerful demo of &lt;strong&gt;WJb running inside Blazor WebAssembly&lt;/strong&gt;, where jobs are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Queued with one click&lt;/li&gt;
&lt;li&gt;✅ Tracked in real-time&lt;/li&gt;
&lt;li&gt;✅ Cancelled or retried from the UI&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 What is WJb?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WJb&lt;/strong&gt; is a lightweight job engine designed for simplicity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimal API surface&lt;/li&gt;
&lt;li&gt;Clear job lifecycle (Queued → Processing → Completed/Failed/Cancelled)&lt;/li&gt;
&lt;li&gt;Built-in progress tracking&lt;/li&gt;
&lt;li&gt;Retry &amp;amp; cancellation support&lt;/li&gt;
&lt;li&gt;Works even in &lt;strong&gt;WASM (no server required)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 The Demo
&lt;/h2&gt;

&lt;p&gt;The UI is extremely simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Run Demo Job&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;A table showing:

&lt;ul&gt;
&lt;li&gt;Job ID&lt;/li&gt;
&lt;li&gt;Status&lt;/li&gt;
&lt;li&gt;Progress&lt;/li&gt;
&lt;li&gt;Message&lt;/li&gt;
&lt;li&gt;Attempts&lt;/li&gt;
&lt;li&gt;Actions (Cancel / Retry)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Here’s the core Razor page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@page "/"

@using WJb.Abstractions
@using WJb.Core
@using WJb.Demo.Wasm.Actions

@inject IJobEngine Engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ▶️ Starting a Job
&lt;/h2&gt;

&lt;p&gt;Enqueueing a job is just one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DemoAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DemoPayload&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DemoPayload&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;DelayMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Done ✅"&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No queue setup.&lt;br&gt;&lt;br&gt;
No worker service.&lt;br&gt;&lt;br&gt;
No background host.&lt;/p&gt;

&lt;p&gt;Just enqueue and go.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔄 Real-Time UI Updates
&lt;/h2&gt;

&lt;p&gt;WJb exposes a simple event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnInitialized&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Changed&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;HandleChanged&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAll&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;HandleChanged&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;InvokeAsync&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAll&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;StateHasChanged&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever a job updates (progress/status), the UI refreshes automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Job State Rendering
&lt;/h2&gt;

&lt;p&gt;Each job comes with a state object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Progress&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Attempts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rendering status is clean and expressive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;span class="badge @(t.State.Status switch
{
    JobStatus.Processing =&amp;gt; "bg-primary",
    JobStatus.Completed =&amp;gt; "bg-success",
    JobStatus.Failed =&amp;gt; "bg-danger",
    JobStatus.Cancelled =&amp;gt; "bg-danger",
    _ =&amp;gt; "bg-secondary"
})"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And progress is just a Bootstrap bar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="progress-bar"
     style="width:@t.State.Progress%"&amp;gt;
    &amp;lt;small&amp;gt;@t.State.Progress%&amp;lt;/small&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✋ Cancel &amp;amp; Retry
&lt;/h2&gt;

&lt;p&gt;WJb supports job control out of the box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Cancel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Cancel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UI logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@if (t.State.Status is JobStatus.Queued or JobStatus.Processing)
{
    &amp;lt;button @onclick="() =&amp;gt; Cancel(t.JobId)"&amp;gt;❌&amp;lt;/button&amp;gt;
}
else if (t.State.Status is JobStatus.Failed or JobStatus.Cancelled)
{
    &amp;lt;button @onclick="() =&amp;gt; Retry(t.JobId)"&amp;gt;🔄&amp;lt;/button&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 The Interesting Part: It Runs in WASM
&lt;/h2&gt;

&lt;p&gt;This is where things get fun.&lt;/p&gt;

&lt;p&gt;All of this works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Without ASP.NET backend&lt;/li&gt;
&lt;li&gt;✅ Without queues like RabbitMQ&lt;/li&gt;
&lt;li&gt;✅ Without hosted services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The job engine runs &lt;strong&gt;inside the browser runtime&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This makes it perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client-side automation&lt;/li&gt;
&lt;li&gt;Long-running UI tasks&lt;/li&gt;
&lt;li&gt;Offline-first applications&lt;/li&gt;
&lt;li&gt;Interactive demos and tooling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Why This Matters
&lt;/h2&gt;

&lt;p&gt;Most job systems are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Heavy&lt;/li&gt;
&lt;li&gt;Infrastructure-dependent&lt;/li&gt;
&lt;li&gt;Hard to integrate into UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WJb flips that:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Jobs&lt;/th&gt;
&lt;th&gt;WJb&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Requires backend&lt;/td&gt;
&lt;td&gt;Works in WASM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worker services&lt;/td&gt;
&lt;td&gt;In-process engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex setup&lt;/td&gt;
&lt;td&gt;Simple API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limited UI integration&lt;/td&gt;
&lt;td&gt;Built for UI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔥 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WJb gives you &lt;strong&gt;background jobs without infrastructure&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Blazor WASM can handle real-time job processing&lt;/li&gt;
&lt;li&gt;The API is intentionally minimal:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Enqueue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Retry&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cancel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAll&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;UI integration is trivial via &lt;code&gt;Engine.Changed&lt;/code&gt;
&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This demo is small, but the idea is powerful:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Background processing doesn’t have to mean backend complexity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With WJb, you can build &lt;strong&gt;responsive, controllable job workflows in the browser&lt;/strong&gt;.&lt;/p&gt;




</description>
      <category>blazor</category>
      <category>webassembly</category>
      <category>dotnet</category>
      <category>ai</category>
    </item>
    <item>
      <title>WJb: Explicit Background Jobs for .NET (Near v1.0)</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Tue, 28 Apr 2026 10:23:29 +0000</pubDate>
      <link>https://dev.to/ukrguru/wjb-explicit-background-jobs-for-net-near-v10-1p34</link>
      <guid>https://dev.to/ukrguru/wjb-explicit-background-jobs-for-net-near-v10-1p34</guid>
      <description>&lt;h1&gt;
  
  
  WJb: Explicit Background Jobs for .NET (Near v1.0)
&lt;/h1&gt;

&lt;p&gt;Background processing in .NET often starts simple — and quietly becomes complex.&lt;/p&gt;

&lt;p&gt;Retries appear where you did not expect them.&lt;br&gt;&lt;br&gt;
Execution happens “somewhere in the background”.&lt;br&gt;&lt;br&gt;
Workflows grow implicit behavior few people fully understand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WJb&lt;/strong&gt; was created as a response to that drift.&lt;/p&gt;

&lt;p&gt;As the project approaches &lt;strong&gt;v1.0&lt;/strong&gt;, this article explains &lt;strong&gt;what WJb is&lt;/strong&gt;, &lt;strong&gt;what it deliberately is not&lt;/strong&gt;, and &lt;strong&gt;why its design looks different from most background job frameworks&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem WJb Tries to Solve
&lt;/h2&gt;

&lt;p&gt;Many background job frameworks optimize for convenience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  automatic retries&lt;/li&gt;
&lt;li&gt;  implicit pipelines&lt;/li&gt;
&lt;li&gt;  hidden orchestration&lt;/li&gt;
&lt;li&gt;  dynamic runtime behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features are useful — until background execution becomes &lt;strong&gt;core business logic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At that point, questions become difficult to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Why did this job run?&lt;/li&gt;
&lt;li&gt;  Why did it retry?&lt;/li&gt;
&lt;li&gt;  What state did it operate on?&lt;/li&gt;
&lt;li&gt;  What decides the next step?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WJb takes a different stance:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If background jobs are part of your domain, their behavior must be explicit and predictable.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Core Design Principles
&lt;/h2&gt;

&lt;p&gt;WJb is built around a small number of firm rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Queue‑First, Always
&lt;/h3&gt;

&lt;p&gt;Nothing executes immediately.&lt;/p&gt;

&lt;p&gt;Every unit of work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  is serialized into a job payload&lt;/li&gt;
&lt;li&gt;  enters a queue explicitly&lt;/li&gt;
&lt;li&gt;  is processed later by a worker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This establishes a hard boundary between &lt;strong&gt;intent&lt;/strong&gt; and &lt;strong&gt;execution&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request work → enqueue → execute later
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No method call ever causes hidden execution.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Explicit Execution Model
&lt;/h3&gt;

&lt;p&gt;WJb does &lt;strong&gt;not&lt;/strong&gt; provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  automatic retries&lt;/li&gt;
&lt;li&gt;  implicit continuation&lt;/li&gt;
&lt;li&gt;  background pipelines&lt;/li&gt;
&lt;li&gt;  workflow engines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a job continues, it does so because &lt;strong&gt;code explicitly enqueued the next job&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnqueueJobAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextJob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Routing belongs to &lt;strong&gt;actions&lt;/strong&gt;, not infrastructure.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Immutable Snapshots
&lt;/h3&gt;

&lt;p&gt;Execution in WJb operates on &lt;strong&gt;immutable snapshots&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  action registries are built deterministically&lt;/li&gt;
&lt;li&gt;  snapshots are replaced atomically&lt;/li&gt;
&lt;li&gt;  readers never observe partial state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This model avoids synchronization complexity and makes reasoning about concurrency trivial.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Actions Own Their Lifecycle
&lt;/h3&gt;

&lt;p&gt;In WJb:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  infrastructure executes&lt;/li&gt;
&lt;li&gt;  domain code decides&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  read metadata&lt;/li&gt;
&lt;li&gt;  perform work&lt;/li&gt;
&lt;li&gt;  optionally enqueue the next job&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Infrastructure never orchestrates workflows or interprets intent.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Minimal Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CompactAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"World"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnqueueJobAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is all it takes to enqueue work.&lt;/p&gt;

&lt;p&gt;Execution happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  when the host starts&lt;/li&gt;
&lt;li&gt;  when the processor consumes the queue&lt;/li&gt;
&lt;li&gt;  with no hidden steps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Workflow Example (Explicit by Design)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fib-start → fib-build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The continuation is not implicit.&lt;/p&gt;

&lt;p&gt;The first action decides explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnqueueJobAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextJob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No framework magic.&lt;br&gt;&lt;br&gt;
No pipeline inference.&lt;br&gt;&lt;br&gt;
No hidden guarantees.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Without Tricks
&lt;/h2&gt;

&lt;p&gt;Despite its explicit design, WJb is fast — very fast.&lt;/p&gt;

&lt;p&gt;Recent baseline benchmarks (Free edition):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;~830k jobs/sec&lt;/strong&gt; single‑thread enqueue&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;~1.9M jobs/sec&lt;/strong&gt; multi‑thread enqueue (20 threads)&lt;/li&gt;
&lt;li&gt;  ✅ strict FIFO within priority&lt;/li&gt;
&lt;li&gt;  ✅ strict priority precedence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These numbers come &lt;strong&gt;without unsafe code&lt;/strong&gt;, &lt;strong&gt;without custom schedulers&lt;/strong&gt;, and &lt;strong&gt;without sacrificing correctness&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Performance is a natural outcome of the architecture — not a special optimization step.&lt;/p&gt;




&lt;h2&gt;
  
  
  What WJb Intentionally Does &lt;em&gt;Not&lt;/em&gt; Do
&lt;/h2&gt;

&lt;p&gt;WJb is not trying to replace everything.&lt;/p&gt;

&lt;p&gt;It deliberately avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  delivery guarantees&lt;/li&gt;
&lt;li&gt;  persistent storage by default&lt;/li&gt;
&lt;li&gt;  retries or backoff strategies&lt;/li&gt;
&lt;li&gt;  distributed coordination&lt;/li&gt;
&lt;li&gt;  dynamic workflow engines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These concerns belong either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  to hosting infrastructure&lt;/li&gt;
&lt;li&gt;  or to explicit domain code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WJb’s job is to remain &lt;strong&gt;transparent and predictable&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Free Edition Today, v1.0 Tomorrow
&lt;/h2&gt;

&lt;p&gt;As of &lt;strong&gt;v0.29&lt;/strong&gt;, the &lt;strong&gt;Free API is frozen&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  public contracts are stable&lt;/li&gt;
&lt;li&gt;  documented behavior matches runtime behavior&lt;/li&gt;
&lt;li&gt;  samples and tests reflect real execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step toward v1.0 is &lt;strong&gt;real‑world usage&lt;/strong&gt;, not feature expansion.&lt;/p&gt;

&lt;p&gt;v1.0 will not mean “more features”.&lt;br&gt;&lt;br&gt;
It will mean &lt;strong&gt;confidence&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who WJb Is For
&lt;/h2&gt;

&lt;p&gt;WJb is for engineers who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  design long‑living systems&lt;/li&gt;
&lt;li&gt;  operate production infrastructure&lt;/li&gt;
&lt;li&gt;  value explicit behavior over automation&lt;/li&gt;
&lt;li&gt;  want background code to behave like foreground code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If convenience tooling worked for your case — keep using it.&lt;/p&gt;

&lt;p&gt;If you ever said &lt;em&gt;“I want to see exactly what happens”&lt;/em&gt; — WJb may be for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;WJb does not try to be clever.&lt;/p&gt;

&lt;p&gt;It tries to be &lt;strong&gt;honest&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Honest about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  when work runs&lt;/li&gt;
&lt;li&gt;  why it runs&lt;/li&gt;
&lt;li&gt;  what state it sees&lt;/li&gt;
&lt;li&gt;  and what happens next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As the project moves toward v1.0, that principle remains unchanged.&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/WJb&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>WJb 0.28.0 Released 🚀</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Thu, 23 Apr 2026 08:36:03 +0000</pubDate>
      <link>https://dev.to/ukrguru/wjb-0280-released-18ii</link>
      <guid>https://dev.to/ukrguru/wjb-0280-released-18ii</guid>
      <description>&lt;p&gt;WJb 0.28.0 is now available on NuGet.&lt;br&gt;
This release is focused on stability and correctness, especially for long‑running and scheduled workloads:&lt;/p&gt;

&lt;p&gt;Improved internal execution reliability&lt;br&gt;
Better cancellation behavior during delays and iterations&lt;br&gt;
Expanded unit test coverage for worker and scheduler logic&lt;br&gt;
No breaking changes&lt;/p&gt;

&lt;p&gt;If you’re using WJb for background jobs or scheduled processing, this release strengthens the foundations without requiring code changes.&lt;br&gt;
👉 NuGet: &lt;a href="https://www.nuget.org/packages/WJb/0.28.0" rel="noopener noreferrer"&gt;https://www.nuget.org/packages/WJb/0.28.0&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>backend</category>
      <category>dotnet</category>
      <category>news</category>
    </item>
    <item>
      <title>Serious question: at this point… who still needs it faster? 🚀</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Mon, 20 Apr 2026 13:32:27 +0000</pubDate>
      <link>https://dev.to/ukrguru/serious-question-at-this-point-who-still-needs-it-faster-32ni</link>
      <guid>https://dev.to/ukrguru/serious-question-at-this-point-who-still-needs-it-faster-32ni</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffro05uy3wjaqjhols30l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffro05uy3wjaqjhols30l.png" alt=" " width="465" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Benchmarking WJb: Measuring Raw Background Job Throughput in .NET</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Sun, 19 Apr 2026 08:32:23 +0000</pubDate>
      <link>https://dev.to/ukrguru/benchmarking-wjb-measuring-raw-background-job-throughput-in-net-pba</link>
      <guid>https://dev.to/ukrguru/benchmarking-wjb-measuring-raw-background-job-throughput-in-net-pba</guid>
      <description>&lt;h1&gt;
  
  
  Benchmarking WJb: Measuring Raw Background Job Throughput in .NET
&lt;/h1&gt;

&lt;p&gt;When building a background job system, performance questions appear almost immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  How fast can I enqueue jobs?&lt;/li&gt;
&lt;li&gt;  Does it scale with concurrent producers?&lt;/li&gt;
&lt;li&gt;  What happens when payloads are not trivial?&lt;/li&gt;
&lt;li&gt;  Are delayed and timer jobs expensive?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To answer these questions early, &lt;strong&gt;WJb ships with a dedicated benchmark project&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt;&lt;/a&gt; &lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;[github.com]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article explains &lt;strong&gt;what exactly is measured&lt;/strong&gt;, &lt;strong&gt;how the benchmarks are structured&lt;/strong&gt;, and &lt;strong&gt;what the numbers really mean&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Benchmark Enqueue Speed First?
&lt;/h2&gt;

&lt;p&gt;WJb is designed as a &lt;strong&gt;lightweight, explicit background job engine&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Unlike full orchestration systems, WJb deliberately avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Persistent storage by default&lt;/li&gt;
&lt;li&gt;  Distributed locks&lt;/li&gt;
&lt;li&gt;  Retries, dashboards, or schedulers baked into the core&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes &lt;strong&gt;enqueue throughput&lt;/strong&gt; a critical foundational metric.&lt;/p&gt;

&lt;p&gt;If placing jobs into the system is slow or unpredictable, &lt;strong&gt;everything else scales poorly&lt;/strong&gt; — regardless of how fast job execution later becomes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is WJb.Benchmarks?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt; is a &lt;strong&gt;standalone console benchmark application&lt;/strong&gt; designed to answer one simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How fast can WJb prepare and enqueue jobs under different conditions?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The benchmark project lives under the test folder and is intentionally isolated from production code to keep results clean and reproducible. &lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;[github.com]&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark Scenarios
&lt;/h2&gt;

&lt;p&gt;The benchmark suite focuses on &lt;strong&gt;enqueue-only performance&lt;/strong&gt; and includes four core scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Single-threaded enqueue
&lt;/h3&gt;

&lt;p&gt;Measures raw throughput when jobs are enqueued sequentially from a single producer.&lt;/p&gt;

&lt;p&gt;This represents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Simple applications&lt;/li&gt;
&lt;li&gt;  Low-contention background usage&lt;/li&gt;
&lt;li&gt;  Baseline overhead of job creation + JSON compaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why it matters:&lt;br&gt;
Single-thread speed reflects &lt;strong&gt;framework overhead&lt;/strong&gt;, not threading tricks.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Multi-threaded enqueue (concurrent producers)
&lt;/h3&gt;

&lt;p&gt;Uses multiple threads enqueueing jobs simultaneously.&lt;/p&gt;

&lt;p&gt;This simulates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Web APIs enqueueing background work&lt;/li&gt;
&lt;li&gt;  Message-driven systems&lt;/li&gt;
&lt;li&gt;  Burst workloads under pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal here is &lt;strong&gt;scalability&lt;/strong&gt;, not just raw numbers.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Heavy JSON payload enqueue
&lt;/h3&gt;

&lt;p&gt;Jobs rarely carry empty payloads in real systems.&lt;/p&gt;

&lt;p&gt;This benchmark measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  JSON serialization overhead&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;JsonObject&lt;/code&gt; compaction cost&lt;/li&gt;
&lt;li&gt;  Memory pressure from larger payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The payload is intentionally heavy to reveal realistic performance drops instead of optimistic results.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Delayed / timer job enqueue
&lt;/h3&gt;

&lt;p&gt;Delayed jobs often involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Extra metadata&lt;/li&gt;
&lt;li&gt;  Timer coordination&lt;/li&gt;
&lt;li&gt;  Scheduling logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This benchmark isolates &lt;strong&gt;enqueue cost only&lt;/strong&gt;, without waiting for execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark Setup
&lt;/h2&gt;

&lt;p&gt;The benchmarks are intentionally boring — and that’s a feature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Action implementation&lt;/strong&gt;: minimal &lt;code&gt;IAction&lt;/code&gt; returning &lt;code&gt;Task.CompletedTask&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Execution&lt;/strong&gt;: enqueue only (no worker execution measured)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: Release build&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Runtime&lt;/strong&gt;: modern .NET&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Environment&lt;/strong&gt;: standard developer machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No database.&lt;br&gt;&lt;br&gt;
No persistence.&lt;br&gt;&lt;br&gt;
No background threads executing jobs.&lt;/p&gt;

&lt;p&gt;This keeps results focused and repeatable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sample Results
&lt;/h2&gt;

&lt;p&gt;A representative benchmark run looks like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WJb Performance Benchmark Suite
==================================
[Multi-threaded Enqueue]
200,000 jobs from 8 threads → ~320 ms
≈ 600k+ jobs/sec

[Single-thread Enqueue]
100,000 jobs → ~180 ms
≈ 500k+ jobs/sec

[Heavy JSON Payload]
20,000 jobs → ~400 ms
≈ 50k jobs/sec

[Delayed / Timer Jobs]
10,000 jobs → ~30 ms
≈ 330k jobs/sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Exact numbers will vary per machine. The &lt;strong&gt;trend and scaling behavior&lt;/strong&gt; are what matter.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How to Read These Numbers (Correctly)
&lt;/h2&gt;

&lt;p&gt;These benchmarks &lt;strong&gt;do not measure job execution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Job compaction&lt;/li&gt;
&lt;li&gt;  JSON serialization&lt;/li&gt;
&lt;li&gt;  Internal queueing&lt;/li&gt;
&lt;li&gt;  Thread contention behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real-world throughput will depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The work your jobs perform&lt;/li&gt;
&lt;li&gt;  Worker concurrency&lt;/li&gt;
&lt;li&gt;  Machine resources&lt;/li&gt;
&lt;li&gt;  Whether persistence is added later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But high enqueue performance is still valuable because it ensures:&lt;/p&gt;

&lt;p&gt;✅ predictable latency under load&lt;br&gt;&lt;br&gt;
✅ minimal overhead per job&lt;br&gt;&lt;br&gt;
✅ headroom for future features&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Approach Works
&lt;/h2&gt;

&lt;p&gt;Many job systems optimize dashboards, retries, or storage first.&lt;/p&gt;

&lt;p&gt;WJb does the opposite:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a fast, explicit, predictable core — then layer complexity consciously.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt; exists to validate that core continually, not once.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run It Yourself
&lt;/h2&gt;

&lt;p&gt;Clone the repository and run the benchmark project directly:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet run -c Release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Because it’s a plain console app, no infrastructure setup is required.&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;a href="https://github.com/UkrGuru/WJb/tree/main/test/WJb.Benchmarks" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/WJb/tree/main/test/WJb.Benchmarks&lt;/a&gt; &lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;[github.com]&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Benchmarks don’t make software good — &lt;strong&gt;discipline does&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But a lightweight job engine that can enqueue &lt;strong&gt;hundreds of thousands of jobs per second&lt;/strong&gt; provides a solid foundation for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  APIs&lt;/li&gt;
&lt;li&gt;  Workers&lt;/li&gt;
&lt;li&gt;  Schedulers&lt;/li&gt;
&lt;li&gt;  Workflow engines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt; is not about bragging rights — it’s about &lt;strong&gt;knowing the cost of every abstraction you add&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If that philosophy resonates with you, WJb is worth exploring further.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;.NET&lt;/code&gt; &lt;code&gt;CSharp&lt;/code&gt; &lt;code&gt;Performance&lt;/code&gt; &lt;code&gt;BackgroundJobs&lt;/code&gt; &lt;code&gt;OpenSource&lt;/code&gt;&lt;/p&gt;




</description>
      <category>backenddevelopment</category>
      <category>opensource</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>WJb Hits 700k+ Jobs/sec: Benchmarking the New Lightweight Background Job Library for .NET</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:54:50 +0000</pubDate>
      <link>https://dev.to/ukrguru/-wjb-hits-700k-jobssec-benchmarking-the-new-lightweight-background-job-library-for-net-1ji3</link>
      <guid>https://dev.to/ukrguru/-wjb-hits-700k-jobssec-benchmarking-the-new-lightweight-background-job-library-for-net-1ji3</guid>
      <description>&lt;h1&gt;
  
  
  WJb Hits 700k+ Jobs/sec: Benchmarking the New Lightweight Background Job Library for .NET
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Just hours after its release&lt;/strong&gt;, a brand-new .NET background job library is already showing impressive performance.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;&lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;WJb&lt;/a&gt;&lt;/strong&gt; — a minimal, flexible, and explicit background job execution library built by UkrGuru (Oleksandr Viktor). Released today (April 15, 2026), WJb focuses on simplicity, predictability, and control instead of heavy magic or complex infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WJb?
&lt;/h2&gt;

&lt;p&gt;While mature solutions like Hangfire and Quartz.NET are powerful, sometimes you just want something &lt;strong&gt;lightweight&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Priority-based queues&lt;/li&gt;
&lt;li&gt;JSON payloads&lt;/li&gt;
&lt;li&gt;Cron-based scheduling&lt;/li&gt;
&lt;li&gt;Clean DI and &lt;code&gt;IHostedService&lt;/code&gt; integration&lt;/li&gt;
&lt;li&gt;No bloat, no hidden behaviors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WJb promises exactly that: explicit, controllable background job processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benchmark Suite
&lt;/h2&gt;

&lt;p&gt;I created a dedicated benchmark console app to stress-test WJb right after installation. The suite measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single-threaded enqueue throughput&lt;/li&gt;
&lt;li&gt;Multi-threaded enqueue scaling (realistic producer load)&lt;/li&gt;
&lt;li&gt;Heavy JSON payload overhead&lt;/li&gt;
&lt;li&gt;Delayed/timer job enqueue speed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benchmark Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Library&lt;/strong&gt;: WJb v0.26.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET&lt;/strong&gt;: Latest (Release configuration)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: Standard development machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: Minimal &lt;code&gt;IAction&lt;/code&gt; implementation (just returns &lt;code&gt;Task.CompletedTask&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Results (v9 run)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WJb Performance Benchmark Suite v9
==================================

WJb initialized.

[Multi-threaded Enqueue] 200,000 jobs from 8 threads
    → 323.74 ms  |  617,771 jobs/sec

[Single-thread Enqueue] 100,000 jobs
    → 186.07 ms  |  537,419 jobs/sec

[Heavy JSON Payload] 20,000 jobs
    → 404.28 ms  |  49,471 jobs/sec

[Delayed/Timer Jobs] 10,000 jobs
    → 29.66 ms  |  337,187 jobs/sec

✅ Benchmark suite completed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-threaded enqueue&lt;/strong&gt; reached over &lt;strong&gt;617k jobs per second&lt;/strong&gt; — excellent scaling under concurrent load.&lt;/li&gt;
&lt;li&gt;Single-threaded performance stayed consistently above &lt;strong&gt;500k jobs/sec&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Heavy JSON payloads showed the expected drop due to serialization (still very respectable at ~49k/sec).&lt;/li&gt;
&lt;li&gt;Delayed jobs performed well even when using the standard enqueue path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What These Numbers Mean
&lt;/h2&gt;

&lt;p&gt;These results are &lt;strong&gt;enqueue-only&lt;/strong&gt; benchmarks (measuring how fast we can prepare and queue jobs). Real-world throughput will also depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How heavy your job actions are&lt;/li&gt;
&lt;li&gt;Number of worker threads configured&lt;/li&gt;
&lt;li&gt;Database/storage backend (if persistence is added later)&lt;/li&gt;
&lt;li&gt;Machine resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still, hitting &lt;strong&gt;600k+ enqueue operations per second&lt;/strong&gt; on day one is very promising for a lightweight library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benchmark Code
&lt;/h2&gt;

&lt;p&gt;You can find the full benchmark project structure and code in my repository (link will be added after publishing). The core pattern follows WJb’s official &lt;code&gt;HelloWJb&lt;/code&gt; sample:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Register actions with &lt;code&gt;services.AddWJb(actions)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;IJobProcessor&lt;/code&gt; + &lt;code&gt;CompactAsync()&lt;/code&gt; + &lt;code&gt;EnqueueJobAsync()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Keep actions simple and idempotent (as recommended by the library)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;WJb is extremely young (literally released today), yet it already shows strong fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean, minimal API&lt;/li&gt;
&lt;li&gt;Great raw enqueue performance&lt;/li&gt;
&lt;li&gt;Clear focus on predictability over automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need lightweight background jobs without pulling in a full orchestrator, WJb looks like a solid contender worth watching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;code&gt;.NET&lt;/code&gt;, &lt;code&gt;BackgroundJobs&lt;/code&gt;, &lt;code&gt;Performance&lt;/code&gt;, &lt;code&gt;C#&lt;/code&gt;, &lt;code&gt;OpenSource&lt;/code&gt;, &lt;code&gt;Async&lt;/code&gt;&lt;/p&gt;

</description>
      <category>woker</category>
      <category>scheduller</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>NPoco vs UkrGuru.Sql: When Streaming Beats Buffering</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Thu, 02 Apr 2026 18:29:25 +0000</pubDate>
      <link>https://dev.to/ukrguru/npoco-vs-ukrgurusql-when-streaming-beats-buffering-1kbd</link>
      <guid>https://dev.to/ukrguru/npoco-vs-ukrgurusql-when-streaming-beats-buffering-1kbd</guid>
      <description>&lt;p&gt;When we talk about database performance in .NET, we often compare ORMs as if they were interchangeable. In practice, &lt;strong&gt;the API shape matters just as much as the implementation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, I benchmark &lt;strong&gt;NPoco&lt;/strong&gt; and &lt;strong&gt;UkrGuru.Sql&lt;/strong&gt; using BenchmarkDotNet, focusing on a very common task: reading a large table from SQL Server. The interesting part is not &lt;em&gt;which library wins&lt;/em&gt;, but &lt;em&gt;why&lt;/em&gt; the numbers differ so much.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Streaming rows with &lt;code&gt;IAsyncEnumerable&amp;lt;T&amp;gt;&lt;/code&gt; is faster, allocates less, and scales better than loading everything into a list.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Test Scenario
&lt;/h2&gt;

&lt;p&gt;The setup is intentionally simple and realistic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; SQL Server
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Table:&lt;/strong&gt; &lt;code&gt;Customers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;SampleStoreLarge&lt;/code&gt; (large enough to stress allocations)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Columns:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CustomerId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FullName&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Email&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CreatedAt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;All benchmarks execute the same SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;CustomerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Customers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No filters, no projections — just raw read performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;BenchmarkDotNet.Attributes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Data.SqlClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;NPoco&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UkrGuru.Sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SqlBenchmark&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ConnectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="s"&gt;"Server=(local);Database=SampleStoreLarge;Trusted_Connection=True;TrustServerCertificate=True;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;CommandText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="s"&gt;"SELECT CustomerId, FullName, Email, CreatedAt FROM Customers"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;NPoco_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FetchAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateConnectionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_StreamRows&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateCommandAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;())&lt;/span&gt;
            &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All benchmarks were run in &lt;strong&gt;Release mode&lt;/strong&gt; with BenchmarkDotNet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results (Execution Time)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NPoco_LoadList&lt;/td&gt;
&lt;td&gt;8.23 ms&lt;/td&gt;
&lt;td&gt;0.33 ms&lt;/td&gt;
&lt;td&gt;8.22 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UkrGuru_LoadList&lt;/td&gt;
&lt;td&gt;5.30 ms&lt;/td&gt;
&lt;td&gt;0.57 ms&lt;/td&gt;
&lt;td&gt;5.34 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.29 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.14 ms&lt;/td&gt;
&lt;td&gt;3.22 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At first glance, streaming is already ~2.5× faster than NPoco. But the real story starts when we look at memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results (Memory &amp;amp; GC)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Gen0&lt;/th&gt;
&lt;th&gt;Gen1&lt;/th&gt;
&lt;th&gt;Gen2&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NPoco_LoadList&lt;/td&gt;
&lt;td&gt;367&lt;/td&gt;
&lt;td&gt;258&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;4.39 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UkrGuru_LoadList&lt;/td&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;td&gt;188&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;2.33 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;164&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.08 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This table explains almost everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Actually Being Measured?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  NPoco_LoadList
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Uses &lt;code&gt;FetchAsync&amp;lt;T&amp;gt;()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Fully materializes a &lt;code&gt;List&amp;lt;Customer&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Allocates buffers and intermediate objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Idiomatic NPoco usage&lt;br&gt;&lt;br&gt;
❌ No streaming support&lt;/p&gt;

&lt;p&gt;NPoco optimizes for &lt;strong&gt;developer productivity&lt;/strong&gt;, not minimal allocations. That’s a valid trade‑off, but it shows up clearly in GC pressure.&lt;/p&gt;




&lt;h3&gt;
  
  
  UkrGuru_LoadList
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Also builds a full list&lt;/li&gt;
&lt;li&gt;  Uses a leaner mapping pipeline&lt;/li&gt;
&lt;li&gt;  Roughly &lt;strong&gt;half the allocations&lt;/strong&gt; of NPoco&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Same algorithm as NPoco&lt;br&gt;&lt;br&gt;
✅ Less overhead&lt;/p&gt;

&lt;p&gt;This is a fair apple‑to‑apple comparison with NPoco’s approach.&lt;/p&gt;




&lt;h3&gt;
  
  
  UkrGuru_StreamRows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Uses &lt;code&gt;IAsyncEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Processes rows one at a time&lt;/li&gt;
&lt;li&gt;  No list allocation&lt;/li&gt;
&lt;li&gt;  No Gen2 collections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ True async streaming&lt;br&gt;&lt;br&gt;
✅ Lowest latency&lt;br&gt;&lt;br&gt;
✅ Most stable GC behavior&lt;/p&gt;

&lt;p&gt;This is not a micro‑optimization — it’s a different execution model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Streaming Wins
&lt;/h2&gt;

&lt;p&gt;The biggest improvement is &lt;strong&gt;not&lt;/strong&gt; raw speed — it’s &lt;strong&gt;memory behavior&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Fewer allocations&lt;/li&gt;
&lt;li&gt;  Almost no object promotion&lt;/li&gt;
&lt;li&gt;  No Gen2 collections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters a lot under real load: ASP.NET requests, background workers, message consumers, etc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Streaming doesn’t just run faster — it scales better.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  About Fairness
&lt;/h2&gt;

&lt;p&gt;This benchmark is &lt;em&gt;not&lt;/em&gt; trying to prove that one ORM is “better” than another.&lt;/p&gt;

&lt;p&gt;It compares &lt;strong&gt;three distinct patterns&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Buffered list materialization (NPoco)&lt;/li&gt;
&lt;li&gt; Buffered list materialization with fewer abstractions&lt;/li&gt;
&lt;li&gt; True async streaming&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Comparing streaming to buffering is not “ORM vs ORM” — it’s &lt;strong&gt;algorithm vs algorithm&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Use Each?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use NPoco when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You want simple, expressive data access&lt;/li&gt;
&lt;li&gt;  Loading lists is acceptable&lt;/li&gt;
&lt;li&gt;  Developer time matters more than raw throughput&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use streaming (e.g. UkrGuru.Sql) when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Result sets are large&lt;/li&gt;
&lt;li&gt;  Latency and GC pressure matter&lt;/li&gt;
&lt;li&gt;  You want full control over execution&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Benchmarks don’t just measure libraries — they measure &lt;strong&gt;abstractions and APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your workload is dominated by large reads, switching from buffered lists to async streaming can cut both &lt;strong&gt;execution time&lt;/strong&gt; and &lt;strong&gt;memory pressure&lt;/strong&gt; dramatically.&lt;/p&gt;

&lt;p&gt;Choose the tool that matches your &lt;strong&gt;data access pattern&lt;/strong&gt;, not just the one you’re used to.&lt;/p&gt;




</description>
      <category>dotnet</category>
      <category>sqlserver</category>
      <category>bench</category>
    </item>
    <item>
      <title>🚀 Simplify ADO.NET Stream Rows ...</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 01 Apr 2026 10:04:53 +0000</pubDate>
      <link>https://dev.to/ukrguru/simplify-adonet-stream-rows--48g7</link>
      <guid>https://dev.to/ukrguru/simplify-adonet-stream-rows--48g7</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;SqlLoadListBenchmark – Simple ADO.NET vs UkrGuru.Sql Demo&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;This demo shows how &lt;strong&gt;ADO.NET&lt;/strong&gt; and &lt;strong&gt;UkrGuru.Sql&lt;/strong&gt; perform the same work using different coding styles, along with benchmark results.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖼 &lt;strong&gt;1. LoadList Demo (ADO.NET vs UkrGuru)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ADO.NET_LoadList&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ADONET_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExecuteReaderAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Customer&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;CustomerId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetInt32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;FullName&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;Email&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;CreatedAt&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;UkrGuru_LoadList&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateConnectionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🖼 &lt;strong&gt;2. StreamRows Demo (ADO.NET vs UkrGuru)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ADO.NET_StreamRows&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ADONET_StreamRows&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;StreamCustomersAsync&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;IAsyncEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;StreamCustomersAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;EnumeratorCancellation&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExecuteReaderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CommandBehavior&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SequentialAccess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Customer&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;CustomerId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetInt32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;FullName&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;Email&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;CreatedAt&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_StreamRows&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateCommandAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;())&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📊 &lt;strong&gt;Benchmark Results&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ADONET_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.953 ms&lt;/td&gt;
&lt;td&gt;0.0472 ms&lt;/td&gt;
&lt;td&gt;0.0441 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.141 ms&lt;/td&gt;
&lt;td&gt;0.0415 ms&lt;/td&gt;
&lt;td&gt;0.0407 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ADONET_LoadList&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.309 ms&lt;/td&gt;
&lt;td&gt;0.0721 ms&lt;/td&gt;
&lt;td&gt;0.0675 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_LoadList&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.713 ms&lt;/td&gt;
&lt;td&gt;0.0908 ms&lt;/td&gt;
&lt;td&gt;0.1116 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📝 Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;StreamRows&lt;/strong&gt;: Both are fast; ADO.NET is slightly faster in this raw sequential benchmark.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;LoadList&lt;/strong&gt;: UkrGuru.Sql is a bit slower in this scenario but provides &lt;strong&gt;much cleaner code&lt;/strong&gt; with far less boilerplate.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Code simplicity vs raw speed&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  ADO.NET = faster, more verbose&lt;/li&gt;
&lt;li&gt;  UkrGuru.Sql = cleaner, safer, more maintainable
Check it out 👇&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/UkrGuru/Sql/tree/main/demos/SqlLoadListBenchmark" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/Sql/tree/main/demos/SqlLoadListBenchmark&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sqlserver</category>
      <category>dotnet</category>
      <category>database</category>
    </item>
    <item>
      <title>UkrGuru vs Microsoft Copilot: Benchmark Results That Speak for Themselves</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 25 Mar 2026 14:05:13 +0000</pubDate>
      <link>https://dev.to/ukrguru/ukrguru-vs-microsoft-copilot-benchmark-results-that-speak-for-themselves-4b2a</link>
      <guid>https://dev.to/ukrguru/ukrguru-vs-microsoft-copilot-benchmark-results-that-speak-for-themselves-4b2a</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;UkrGuru vs Microsoft Copilot: Benchmark Results That Speak for Themselves&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;When you optimize for real‑world performance, microseconds matter — sometimes &lt;em&gt;nanoseconds&lt;/em&gt; matter.&lt;br&gt;&lt;br&gt;
This benchmark compares &lt;strong&gt;UkrGuru&lt;/strong&gt; implementations with &lt;strong&gt;Microsoft Copilot‑generated equivalents&lt;/strong&gt; across common low-level operations: primitives, arrays, serialization, and structs.&lt;/p&gt;

&lt;p&gt;The results were surprising — especially considering that Copilot code tends to follow “safe defaults,” while UkrGuru focuses heavily on allocation‑free, branch‑minimal, CPU‑friendly implementation patterns.&lt;/p&gt;

&lt;p&gt;This article summarizes the benchmark results and provides a downloadable table for transparency.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📊 Benchmark Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The table below shows &lt;strong&gt;Mean execution time&lt;/strong&gt;, &lt;strong&gt;Error&lt;/strong&gt;, &lt;strong&gt;StdDev&lt;/strong&gt;, &lt;strong&gt;Rank&lt;/strong&gt;, and &lt;strong&gt;Memory Allocation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lower &lt;strong&gt;Mean&lt;/strong&gt; and &lt;strong&gt;Rank&lt;/strong&gt; are better.&lt;br&gt;&lt;br&gt;
Lower &lt;strong&gt;Allocated&lt;/strong&gt; (ideally 0 bytes) is also better.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Method        | Mean        | Error      | StdDev    | Rank | Gen0   | Allocated |
|-------------- |------------:|-----------:|----------:|-----:|-------:|----------:|
| Ukr_Bool      |   0.9436 ns |  0.0552 ns | 0.0030 ns |    2 |      - |         - |
| Cop_Bool      |   5.5047 ns |  0.2465 ns | 0.0135 ns |    4 |      - |         - |
| Ukr_Int       |   5.4953 ns |  0.6840 ns | 0.0375 ns |    4 |      - |         - |
| Cop_Int       |  12.9375 ns |  0.1144 ns | 0.0063 ns |    8 |      - |         - |
| Ukr_Double    |  23.5338 ns |  0.9775 ns | 0.0536 ns |   13 |      - |         - |
| Cop_Double    |  22.5574 ns |  1.4858 ns | 0.0814 ns |   12 |      - |         - |
| Ukr_Decimal   |  29.7762 ns |  0.9910 ns | 0.0543 ns |   15 |      - |         - |
| Cop_Decimal   |  30.6302 ns |  2.3973 ns | 0.1314 ns |   16 |      - |         - |
| Ukr_Guid      |  12.7784 ns |  0.3671 ns | 0.0201 ns |    7 |      - |         - |
| Cop_Guid      |  12.1073 ns |  1.8873 ns | 0.1035 ns |    6 |      - |         - |
| Ukr_DateOnly  |  52.5456 ns |  2.6977 ns | 0.1479 ns |   17 |      - |         - |
| Cop_DateOnly  |  57.3368 ns |  2.9485 ns | 0.1616 ns |   18 | 0.0036 |      48 B |
| Ukr_TimeOnly  | 109.1004 ns |  1.9878 ns | 0.1090 ns |   20 |      - |         - |
| Cop_TimeOnly  | 119.5629 ns | 10.2523 ns | 0.5620 ns |   21 | 0.0041 |      56 B |
| Ukr_TimeSpan  |  52.4028 ns |  1.9116 ns | 0.1048 ns |   17 |      - |         - |
| Cop_TimeSpan  |  62.9908 ns | 15.9374 ns | 0.8736 ns |   19 | 0.0030 |      40 B |
| Ukr_ByteArray |  15.5711 ns |  0.7072 ns | 0.0388 ns |    9 | 0.0055 |      72 B |
| Cop_ByteArray |  15.7549 ns |  0.7830 ns | 0.0429 ns |   10 | 0.0055 |      72 B |
| Ukr_CharArray |   0.9538 ns |  0.3159 ns | 0.0173 ns |    3 |      - |         - |
| Cop_CharArray |   0.8838 ns |  0.1034 ns | 0.0057 ns |    1 |      - |         - |
| Ukr_Serialize |   5.6374 ns |  0.6384 ns | 0.0350 ns |    5 | 0.0043 |      56 B |
| Cop_Serialize |  12.0702 ns |  0.5457 ns | 0.0299 ns |    6 | 0.0067 |      88 B |
| Ukr_Enum      |  24.4368 ns |  2.8392 ns | 0.1556 ns |   14 | 0.0018 |      24 B |
| Cop_Enum      |  21.3234 ns |  1.0134 ns | 0.0555 ns |   11 | 0.0043 |      56 B |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🔥 Key Observations&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. UkrGuru wins most primitive operations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Especially in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Bool&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Int&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Decimal&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;TimeSpan&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These results highlight extremely efficient, allocation‑free handling of simple .NET types.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Copilot sometimes wins — but only occasionally&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There &lt;em&gt;are&lt;/em&gt; categories where Copilot’s code came out slightly ahead (e.g., &lt;code&gt;CharArray&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This is good — benchmarks should challenge both sides.&lt;br&gt;&lt;br&gt;
It makes the overall results more meaningful.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Memory allocations reveal the biggest gap&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In several operations, Copilot-generated code allocates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;48 B&lt;/strong&gt; in &lt;code&gt;DateOnly&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;56 B&lt;/strong&gt; in &lt;code&gt;TimeOnly&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;40 B&lt;/strong&gt; in &lt;code&gt;TimeSpan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;88 B&lt;/strong&gt; in &lt;code&gt;Serialize&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;56 B&lt;/strong&gt; in Enum conversions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile, most UkrGuru methods remain &lt;strong&gt;0‑allocation&lt;/strong&gt;, which is critical for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  high-throughput APIs&lt;/li&gt;
&lt;li&gt;  microservices&lt;/li&gt;
&lt;li&gt;  real-time pipelines&lt;/li&gt;
&lt;li&gt;  game loops&lt;/li&gt;
&lt;li&gt;  tight CPU‑bound workloads&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🤖 Why Copilot Can’t Keep Up&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Microsoft Copilot is &lt;strong&gt;great at generating safe general-purpose code&lt;/strong&gt;, but not specialized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  nanosecond‑level optimization&lt;/li&gt;
&lt;li&gt;  allocation‑free pipelines&lt;/li&gt;
&lt;li&gt;  branch elimination&lt;/li&gt;
&lt;li&gt;  struct‑level micro-optimizations&lt;/li&gt;
&lt;li&gt;  IL-friendly patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s exactly where &lt;strong&gt;UkrGuru&lt;/strong&gt; excels — handcrafted low-level performance-oriented code.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🏁 Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This benchmark doesn’t say “Copilot is bad.”&lt;br&gt;&lt;br&gt;
It simply shows that &lt;strong&gt;generic AI-generated code cannot outperform hand‑tuned, purpose-built UkrGuru implementations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your application needs maximum performance with minimal allocations — UkrGuru wins.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📦 Want to reproduce the benchmark?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Full source code, including benchmark classes and configuration, is available here:&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;&lt;a href="https://github.com/UkrGuru/Sql/tree/main/dev/ResultsBench/ResultsBench" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/Sql/tree/main/dev/ResultsBench/ResultsBench&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dotnet</category>
      <category>programming</category>
    </item>
    <item>
      <title>updated for WJb 0.25.0-beta</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Tue, 13 Jan 2026 05:53:17 +0000</pubDate>
      <link>https://dev.to/ukrguru/updated-for-wjb-0250-beta-e0h</link>
      <guid>https://dev.to/ukrguru/updated-for-wjb-0250-beta-e0h</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/ukrguru" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2645949%2Fc57b0952-c7b2-4419-b654-d898c8c54abf.jpg" alt="ukrguru"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/ukrguru/basics-getting-started-with-wjb-3i3o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Basics (Getting Started) with WJb&lt;/h2&gt;
      &lt;h3&gt;Oleksandr Viktor ・ Dec 17 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>programming</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>https://github.com/UkrGuru/Sql - simple and the best</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 08 Oct 2025 19:51:55 +0000</pubDate>
      <link>https://dev.to/ukrguru/httpsgithubcomukrgurusql-simple-and-the-best-3kef</link>
      <guid>https://dev.to/ukrguru/httpsgithubcomukrgurusql-simple-and-the-best-3kef</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/UkrGuru/Sql" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F08193186a071d84e84549f0456c5709b7ac4e4acb110620b5155363f8029ed36%2FUkrGuru%2FSql" height="600" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/UkrGuru/Sql" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - UkrGuru/Sql
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Contribute to UkrGuru/Sql development by creating an account on GitHub.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Try UkrGuru.Sql with New Optimized `Results.Parse`</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Thu, 29 May 2025 05:55:41 +0000</pubDate>
      <link>https://dev.to/ukrguru/try-ukrgurusql-with-new-optimized-resultsparse-5ain</link>
      <guid>https://dev.to/ukrguru/try-ukrgurusql-with-new-optimized-resultsparse-5ain</guid>
      <description>&lt;p&gt;Here’s a short article with the requested title:&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Try UkrGuru.Sql with New Optimized &lt;code&gt;Results.Parse&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The latest release of &lt;strong&gt;UkrGuru.Sql&lt;/strong&gt; introduces a powerful enhancement: an optimized &lt;code&gt;Results.Parse&lt;/code&gt; method designed to streamline how developers handle SQL query results in .NET applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 What’s New?
&lt;/h3&gt;

&lt;p&gt;The new &lt;code&gt;Results.Parse&lt;/code&gt; method significantly improves performance and usability by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faster parsing&lt;/strong&gt; of SQL result sets into .NET objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced memory footprint&lt;/strong&gt; for large datasets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved error handling&lt;/strong&gt; and type safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified syntax&lt;/strong&gt; for cleaner, more maintainable code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Benchmark Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Gen0&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ResultsNew_ToStr&lt;/td&gt;
&lt;td&gt;541.0 ns&lt;/td&gt;
&lt;td&gt;66.87 ns&lt;/td&gt;
&lt;td&gt;3.67 ns&lt;/td&gt;
&lt;td&gt;0.0830&lt;/td&gt;
&lt;td&gt;1096 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultsOld_ToStr&lt;/td&gt;
&lt;td&gt;2,195.4 ns&lt;/td&gt;
&lt;td&gt;177.93 ns&lt;/td&gt;
&lt;td&gt;9.75 ns&lt;/td&gt;
&lt;td&gt;0.1411&lt;/td&gt;
&lt;td&gt;1872 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultsNew_FromStr&lt;/td&gt;
&lt;td&gt;1,021.9 ns&lt;/td&gt;
&lt;td&gt;85.43 ns&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;0.0629&lt;/td&gt;
&lt;td&gt;840 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultsOld_FromStr&lt;/td&gt;
&lt;td&gt;1,521.0 ns&lt;/td&gt;
&lt;td&gt;166.13 ns&lt;/td&gt;
&lt;td&gt;9.11 ns&lt;/td&gt;
&lt;td&gt;0.0515&lt;/td&gt;
&lt;td&gt;696 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These results show a clear performance gain in both serialization and deserialization with the new implementation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="n"&gt;_oInputs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DBNull&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DateOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DateTimeOffset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TimeOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sc"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"AV &amp;amp; ASD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Encoding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AV &amp;amp; ASD"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="sc"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'V'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'&amp;amp;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'S'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'D'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;TestEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;One&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;//new string[] { "A", "V", "&amp;amp;", "A", "S", "D" },&lt;/span&gt;
    &lt;span class="c1"&gt;//new NamedType { Id = 1, Name = "Test" }&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="nf"&gt;ResultsNew_ToStr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[&lt;/span&gt;&lt;span class="n"&gt;_oInputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_oInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="c1"&gt;//Console.WriteLine(values[i]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="nf"&gt;ResultsNew_FromStr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// null&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// byte&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// short&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// int&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// long&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// float&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt; &lt;span class="c1"&gt;//values[index++] = ResultsNew.Parse&amp;lt;double&amp;gt;(_sInputs[8]); // double&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// decimal&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DateOnly&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// DateOnly&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// DateTime&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DateTimeOffset&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// DateTime&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TimeOnly&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// TimeOnly&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// TimeOnly&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Guid&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// char&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// string&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;]&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// byte[]&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;]&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// char[]&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TestEnum&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// enum&lt;/span&gt;
    &lt;span class="c1"&gt;//values[index++] = ResultsNew.Parse&amp;lt;string[]&amp;gt;(_sInputs[21]); // string[]&lt;/span&gt;
    &lt;span class="c1"&gt;//values[index++] = ResultsNew.Parse&amp;lt;NamedType&amp;gt;(_sInputs[22]);&lt;/span&gt;

    &lt;span class="c1"&gt;//for (var i = 0; i &amp;lt; values.Length; i++)&lt;/span&gt;
    &lt;span class="c1"&gt;//{&lt;/span&gt;
    &lt;span class="c1"&gt;//    Console.WriteLine(values[i]);&lt;/span&gt;
    &lt;span class="c1"&gt;//}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🛠️ Why It Matters
&lt;/h3&gt;

&lt;p&gt;Whether you're building APIs, background services, or data-driven applications, the optimized &lt;code&gt;Results.Parse&lt;/code&gt; helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimize boilerplate code&lt;/li&gt;
&lt;li&gt;Improve application responsiveness&lt;/li&gt;
&lt;li&gt;Focus more on business logic and less on data plumbing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📦 Ready to Explore?
&lt;/h3&gt;

&lt;p&gt;Check out the package on &lt;a href="https://www.nuget.org/packages/UkrGuru.Sql" rel="noopener noreferrer"&gt;NuGet&lt;/a&gt; and start building smarter, faster, and cleaner SQL-powered .NET apps today.&lt;/p&gt;




&lt;p&gt;Would you like this article formatted for a blog post, social media, or a README file?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>sqlserver</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
