Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 13 additions & 12 deletions .github/workflows/nugetpackage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@ on:
tags:
- "v[0-9]+.[0-9]+.[0-9]+"

env:
DOTNET_VERSION: '10.0'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

jobs:
release:
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -25,7 +24,7 @@ jobs:
- name: Set VERSION variable from tag
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV

- name: Setup .NET (all versions for multi-targeting)
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
Expand All @@ -37,9 +36,7 @@ jobs:
run: dotnet restore src/NetFramework.Task.Management.sln

- name: Build
run: |
dotnet build src/NetFramework.Task.Management/NetFramework.Tasks.Management.csproj --configuration Release /p:Version=${VERSION} --no-restore
dotnet build src/NetFramework.Task.Management.Abstractions/NetFramework.Tasks.Management.Abstractions.csproj --configuration Release /p:Version=${VERSION} --no-restore
run: dotnet build src/NetFramework.Task.Management.sln --configuration Release /p:Version=${VERSION} --no-restore

- name: Test
run: dotnet test src/NetFramework.Tasks.Management.xUnit.Tests/ --configuration Release --no-build --logger "console;verbosity=normal"
Expand All @@ -49,8 +46,12 @@ jobs:
dotnet pack src/NetFramework.Task.Management/NetFramework.Tasks.Management.csproj --configuration Release /p:Version=${VERSION} --no-build --output $GITHUB_WORKSPACE/packages
dotnet pack src/NetFramework.Task.Management.Abstractions/NetFramework.Tasks.Management.Abstractions.csproj --configuration Release /p:Version=${VERSION} --no-build --output $GITHUB_WORKSPACE/packages

- name: Push NetFramework.Tasks.Management
run: dotnet nuget push $GITHUB_WORKSPACE/packages/NetFramework.Tasks.Management.${VERSION}.nupkg --source https://nuget.pkg.github.com/ryujose/index.json --api-key ${GITHUB_TOKEN}
- name: Push to GitHub Packages
run: |
dotnet nuget push $GITHUB_WORKSPACE/packages/NetFramework.Tasks.Management.${VERSION}.nupkg --source https://nuget.pkg.github.com/ryujose/index.json --api-key ${{ secrets.GITHUB_TOKEN }}
dotnet nuget push $GITHUB_WORKSPACE/packages/NetFramework.Tasks.Management.Abstractions.${VERSION}.nupkg --source https://nuget.pkg.github.com/ryujose/index.json --api-key ${{ secrets.GITHUB_TOKEN }}

- name: Push NetFramework.Tasks.Management.Abstractions
run: dotnet nuget push $GITHUB_WORKSPACE/packages/NetFramework.Tasks.Management.Abstractions.${VERSION}.nupkg --source https://nuget.pkg.github.com/ryujose/index.json --api-key ${GITHUB_TOKEN}
- name: Push to NuGet.org
run: |
dotnet nuget push $GITHUB_WORKSPACE/packages/NetFramework.Tasks.Management.${VERSION}.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
dotnet nuget push $GITHUB_WORKSPACE/packages/NetFramework.Tasks.Management.Abstractions.${VERSION}.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate
106 changes: 104 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,107 @@
# NetTaskManagement

This dependency will grant to you the ability to manipulate the life of the tasks around your app.
A .NET Standard 2.0 library for Task Parallel Library (TPL) orchestration with Dependency Injection support.

You will perform a better multi tasking app and a reusage of some tasks with each names when clearing them from the Garbage Collector.
Tasks are identified by **string key** and managed through a **status-based API** — no raw `Task` objects exposed to callers. The library handles the full task lifecycle: register → start → cancel → check completion → delete, and exposes an append-only observability queue that captures disposal metadata for external monitoring.

## Packages

| Package | NuGet |
|---|---|
| `NetFramework.Tasks.Management` | Core implementation |
| `NetFramework.Tasks.Management.Abstractions` | Interfaces, enums, and models only |

## Installation

```bash
dotnet add package NetFramework.Tasks.Management
```

If you only need the `ITaskManagement` contract (e.g. in a project that wires up DI but doesn't consume the implementation directly):

```bash
dotnet add package NetFramework.Tasks.Management.Abstractions
```

## Quick start

### Register the service

```csharp
services.AddTaskManagement();
```

### Inject and use `ITaskManagement`

```csharp
public class MyService
{
private readonly ITaskManagement _tasks;

public MyService(ITaskManagement tasks) => _tasks = tasks;

public void RunJob(string jobName)
{
var cts = new CancellationTokenSource();

_tasks.RegisterTask(jobName, state =>
{
var token = ((CancellationTokenSource)state).Token;
while (!token.IsCancellationRequested)
{
// do work
}
}, cts);

_tasks.StartTask(jobName);
}

public void CancelJob(string jobName) => _tasks.CancelTask(jobName);
}
```

## API reference

All methods return `TaskManagementStatus` — an enum value instead of throwing exceptions for expected outcomes.

| Method | Description |
|---|---|
| `RegisterTask(name, action, cts)` | Registers a new task by name |
| `StartTask(name)` | Starts a previously registered task |
| `CancelTask(name)` | Requests cancellation via the task's `CancellationTokenSource` |
| `CheckTaskStatusCompleted(name, retry, timeoutMs)` | Polls until the task completes or the timeout elapses |
| `DeleteTask(name, sendToQueue)` | Disposes the task and removes it from the registry; optionally enqueues disposal metadata |
| `DequeueTaskDisposedDataModel(out model)` | Dequeues one disposal record for external monitoring |
| `GetTasksStatus()` | Returns a snapshot `Dictionary<string, TaskStatus>` of all live tasks |
| `CancelAllTasks(except, ref failed)` | Cancels all tasks, optionally skipping a list of names |
| `CheckAllTaskStatusCompleted(except, ref statuses, retry, timeoutMs)` | Polls completion for all tasks, optionally skipping a list of names |
| `GetCancellationTokenSource(name, ref cts)` | Retrieves the `CancellationTokenSource` for a registered task |

### Status enum highlights

| Status | Meaning |
|---|---|
| `Added` | Task registered successfully |
| `Started` | Task started successfully |
| `Canceled` | Cancellation requested |
| `Completed` | Task reached a completion state |
| `NotCompleted` | Polling timed out before completion |
| `Deleted` | Task disposed and removed |
| `TaskNotFound` | No task registered under that name |
| `AlreadyRegistered` | A task with that name already exists |

## Observability queue

When `DeleteTask(name, sendToQueue: true)` is called, a `TaskDisposedDataModel` record (task name, id, final status, disposed flag) is appended to an internal `ConcurrentQueue`. Dequeue and forward it to your logging or monitoring platform however you like:

```csharp
if (_tasks.DequeueTaskDisposedDataModel(out var record) == TaskManagementStatus.ObjectInfoDequeued)
{
logger.LogInformation("Task {Name} (id={Id}) finished with status {Status}",
record.TaskName, record.TaskId, record.TaskStatus);
}
```

## License

MIT © Jose Luis Guerra Infante
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,19 @@

<PropertyGroup>
<PackageId>NetFramework.Tasks.Management.Abstractions</PackageId>
<Authors>Jose Luis Guerra Infante</Authors>
<Copyright>Copyright © Jose Luis Guerra Infante</Copyright>
<Description>Interfaces, enums, and models for NetFramework.Tasks.Management — a .NET Standard 2.0 TPL orchestration library with Dependency Injection support. Reference this package when you only need the ITaskManagement contract and status types without depending on the core implementation.</Description>
<PackageTags>task tpl task-parallel-library dependency-injection abstractions interfaces netstandard dotnet</PackageTags>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/Ryujose/NetTaskManagement</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/Ryujose/NetTaskManagement</RepositoryUrl>
</PropertyGroup>

<ItemGroup>
<None Include="..\..\README.md" Pack="true" PackagePath="\"/>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,21 @@

<PropertyGroup>
<PackageId>NetFramework.Tasks.Management</PackageId>
<Authors>Jose Luis Guerra Infante</Authors>
<Copyright>Copyright © Jose Luis Guerra Infante</Copyright>
<Description>A .NET Standard 2.0 library for Task Parallel Library (TPL) orchestration with Dependency Injection support. Tasks are identified by string key and managed through a status-based API — register, start, cancel, check completion, and delete — without exposing raw Task objects to callers. Includes an append-only observability queue that captures disposal metadata for external monitoring.</Description>
<PackageTags>task tpl task-parallel-library dependency-injection orchestration netstandard dotnet</PackageTags>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/Ryujose/NetTaskManagement</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/Ryujose/NetTaskManagement</RepositoryUrl>
</PropertyGroup>

<ItemGroup>
<None Include="..\..\README.md" Pack="true" PackagePath="\"/>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.1" />
Expand Down
Loading