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:
- API Controller – Receives the import request and enqueues it immediately
- Background Task Broker – Stores requests in a thread-safe
BlockingCollection<T> - Hosted Service – Manages long-running worker processes that dequeue tasks
- Task Handler – Creates scoped service providers to resolve dependencies
- 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
src/AntSK/Controllers/KMSController.cs– HTTP endpoint that creates the import request and enqueues itsrc/MiddleWare/AntSK.BackgroundTask/AntSK/BackgroundTask/BackgroundTaskBroker.cs– Core broker usingBlockingCollection<T>for thread-safe queuingsrc/MiddleWare/AntSK.BackgroundTask/AntSK/BackgroundTask/BackgroundTaskHostedService.cs– Hosted service managing the worker lifecyclesrc/AntSK.Domain/Domain/Other/BackGroundTaskHandler.cs– Handler creating scoped DI containers per tasksrc/AntSK.Domain/Domain/Service/ImportKMSService.cs– Business logic integrating KernelMemory for document processingsrc/AntSK/Program.cs– DI registration viaAddBackgroundTaskBroker()andAddHandler<>()BackgroundTaskBrokerServiceCollectionExtensions.cs– Extension methods enabling fluent registration
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
BackgroundTaskHostedServicecontinuously process the queue, executing imports on separate threads from the ASP.NET thread pool. - Scoped DI containers created per task in
BackGroundTaskHandlerensure proper isolation and disposal of database contexts and KernelMemory clients. - KernelMemory SDK integration in
ImportKMSServicehandles 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:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →