How AntSK Uses Background Task Processing for Knowledge Base Document Import

AntSK decouples knowledge base document imports from HTTP requests by queuing import tasks in a BlockingCollection-backed broker and processing them asynchronously through hosted background workers that handle document chunking, embedding, and persistence.

AntSK (aidotnet/antsk) is an open-source AI knowledge management system that leverages background task processing to handle large-scale knowledge base document imports without blocking the web interface. When users upload files, URLs, or text batches to a knowledge base (KMS), the system immediately returns control to the user while dedicated workers process the ingestion pipeline in the background using the KernelMemory SDK.

The Import Pipeline Architecture

AntSK's document import flow follows a producer-consumer pattern with five distinct layers:

  1. API Controller – Receives the import request and enqueues it immediately
  2. Background Task Broker – Stores requests in a thread-safe BlockingCollection<T>
  3. Hosted Service – Manages long-running worker processes that dequeue tasks
  4. Task Handler – Creates scoped service providers to resolve dependencies
  5. Import Service – Executes the actual document processing against KernelMemory

This architecture ensures that uploading a 100-page PDF or crawling a large website returns an HTTP response in milliseconds, while the heavy lifting occurs on separate background threads.

Step-by-Step Implementation

HTTP Endpoint and Task Enqueueing

The process begins in src/AntSK/Controllers/KMSController.cs. The ImportKMSTask method receives an ImportKMSTaskDTO, initializes a KmsDetails database record to track progress, and enqueues the request via _taskBroker.QueueWorkItem().

// src/AntSK/Controllers/KMSController.cs
[HttpPost]
public async Task<IActionResult> ImportKMSTask(ImportKMSTaskDTO model)
{
    var req = model.ToDTO<ImportKMSTaskReq>();
    var detail = new KmsDetails { /* … initialize … */ };
    await _kmsDetailsRepositories.InsertAsync(detail);
    req.KmsDetail = detail;
    req.IsQA = model.IsQA;
    _taskBroker.QueueWorkItem(req);   // <-- fire-and-forget
    return Ok();
}

This fire-and-forget pattern allows the controller to return Ok() immediately while the import continues asynchronously.

The Background Task Broker

The core queuing mechanism resides in src/MiddleWare/AntSK.BackgroundTask/AntSK/BackgroundTask/BackgroundTaskBroker.cs. The broker uses a BlockingCollection<T> to store ImportKMSTaskReq instances, providing thread-safe producer-consumer semantics.

// BackgroundTaskBroker.cs – worker loop
foreach (T item in _broker.TakeMany())
{
    var t2 = _handler.ExecuteAsync(item);
    // errors are logged, then we await all concurrent tasks
}

The TakeMany() method blocks workers until work items become available, efficiently utilizing CPU resources without polling overhead.

Hosted Service and Worker Management

During application startup in src/AntSK/Program.cs, the system registers the broker and handler using extension methods:

// src/AntSK/Program.cs – DI registration
builder.Services.AddBackgroundTaskBroker()
                .AddHandler<ImportKMSTaskReq, BackGroundTaskHandler>("ImportKMSTask");

The AddBackgroundTaskBroker() method (defined in BackgroundTaskBrokerServiceCollectionExtensions.cs) registers BackgroundTaskHostedService, an IHostedService implementation. This hosted service spins up a configurable number of BackgroundTaskWorker instances when the ASP.NET host starts. Each worker continuously pulls items from the broker and executes the registered handler.

Scoped Handler Execution

The BackGroundTaskHandler class in src/AntSK.Domain/Domain/Other/BackGroundTaskHandler.cs implements IBackgroundTaskHandler<ImportKMSTaskReq>. It creates a new DI scope for each import request to ensure proper disposal of database contexts and KernelMemory clients.

// src/AntSK.Domain/Domain/Other/BackGroundTaskHandler.cs
public async Task ExecuteAsync(ImportKMSTaskReq item)
{
    using var scope = _scopeFactory.CreateScope();
    var importSvc = scope.ServiceProvider.GetRequiredService<IImportKMSService>();
    importSvc.ImportKMSTask(item);   // synchronous call, wrapped in a background thread
}

Using CreateScope() guarantees that scoped services like DbContext are not shared across concurrent background tasks, preventing cross-contamination of entity tracking and ensuring thread safety.

Document Ingestion Logic

The actual import logic lives in src/AntSK.Domain/Domain/Service/ImportKMSService.cs. The ImportKMSTask method determines the import source—file, URL, raw text, or Excel—and invokes the appropriate KernelMemory SDK methods:

  • _memory.ImportDocumentAsync() for file uploads
  • _memory.ImportWebPageAsync() for URL crawling
  • _memory.ImportTextAsync() for raw text content
// src/AntSK.Domain/Domain/Service/ImportKMSService.cs
var importResult = _memory.ImportDocumentAsync(
    new Document(fileid).AddFile(req.FilePath)
                        .AddTag(KmsConstantcs.KmsIdTag, req.KmsId),
    index: KmsConstantcs.KmsIndex).Result;

After the KernelMemory SDK completes chunking, embedding, and vector storage, the service updates the KmsDetails status to Success or Fail and persists document metadata to the database. This makes the new knowledge instantly searchable by AntSK's chat interfaces.

Key Source Files and Components

Summary

  • AntSK decouples import processing from HTTP requests using a background task broker based on BlockingCollection<T>, ensuring the web API remains responsive during large document ingestion.
  • Dedicated background workers managed by BackgroundTaskHostedService continuously process the queue, executing imports on separate threads from the ASP.NET thread pool.
  • Scoped DI containers created per task in BackGroundTaskHandler ensure proper isolation and disposal of database contexts and KernelMemory clients.
  • KernelMemory SDK integration in ImportKMSService handles the heavy lifting of document chunking, embedding generation, and vector database persistence asynchronously.

Frequently Asked Questions

How does AntSK prevent HTTP timeouts during large document imports?

AntSK immediately returns an HTTP 200 response after enqueuing the import task in KMSController.ImportKMSTask, before any document processing begins. The actual ingestion—parsing, chunking, and embedding—happens asynchronously in background workers, preventing the client from waiting for long-running operations to complete.

What is the role of the BlockingCollection in AntSK's background processing?

The BlockingCollection<T> in BackgroundTaskBroker.cs acts as a thread-safe buffer between the HTTP controller (producer) and background workers (consumers). It provides blocking semantics via TakeMany(), allowing workers to sleep efficiently when no work is available while ensuring immediate wakeup when new import requests arrive.

How does AntSK ensure proper resource disposal during background imports?

Each import task runs within a dedicated dependency injection scope created by BackGroundTaskHandler using IServiceScopeFactory.CreateScope(). This pattern guarantees that scoped services like Entity Framework Core's DbContext and KernelMemory clients are instantiated fresh for each task and disposed immediately after completion, preventing memory leaks and cross-task data contamination.

Can the number of background workers be configured in AntSK?

Yes. The BackgroundTaskBroker supports configurable concurrency through its worker pool management. When calling AddBackgroundTaskBroker(), the system registers BackgroundTaskHostedService which spawns multiple BackgroundTaskWorker instances. The exact count can be tuned via configuration options passed to the broker during registration in Program.cs, allowing administrators to balance import throughput against server resource constraints.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →