NuGet Package Commands Library, for coordination of synchronous and asynchronous actions

Commands simplifies coordination of asynchronous and synchronous activities.

It works with both task and non-task-based operations. The library is built upon class Command, which represents an action. A Command may be run synchronously or asynchronously, and may be aborted.

ParallelCommands, itself a Command, executes a collection of commands concurrently, and SequentialCommands executes its commands in sequence. Using these classes, it's possible to compose deep levels of coordinated actions.

For example, SequentialCommands can hold instances of ParallelCommands, which in turn could hold SequentialCommands, and any other Command-derived object.

PeriodicCommand repeats its action at a given interval, ScheduledCommand runs once at a specific time, and RecurringCommand runs at times that are provided via a callback.

RetryableCommand offers the option to conditionally keep retrying a failed command, FinallyCommand provides a mechanism to ensure a cleanup routine is run regardless of whether a command succeeds or fails, and TimeLimitedCommand fails with a timeout exception if a given duration elapses before the command finishes execution.

All of the above Command classes are simply containers for other Command objects that presumably do something of interest. They can be combined in ways that offer a lot of customization. For example, to make an HttpRequest at a given time, with a timeout and a configurable number of retries, you could create a ScheduledCommand containing a RetryableCommand containing a TimeLimitedCommand containing an HttpRequestCommand.

TaskCommand, DelegateCommand and Command.AsTask() offer easy integration with tasks and delegates.

CommandDispatcher manages asynchronous execution of dynamically generated commands.

The Command class allows registration of ICommandMonitor objects. CommandTracer will write diagnostic output to the debug stream, and CommandLogger will write diagnostic output to file.

Using the provided CommandLogViewer app (source available in GitHub), it is possible to see the status of all command executions, including their parent/child relationships.

Example usage can be found here:

The entire source lives here:

Guidelines for developing your own Command-derived class:

- If the implementation of your command is naturally synchronous, inherit from SyncCommand

- If the implementation of your command is naturally asynchronous and makes use of tasks (i.e. the Task class), inherit from TaskCommand

- If the implementation of your command is naturally asynchronous but does not make use of tasks, inherit from AsyncCommand

- Make your implementation responsive to abort requests if it could take more than a trivial amount of time. To do this, make ocassional calls to Command.CheckAbortFlag() or Command.AbortRequested

A versions for C++ exists at

A help file containing complete documentation exists within this package's contents.


Version: 3.0.7
Author(s): Eric Fieleke
Last Update: Monday, May 10, 2021
.NET Fiddle: Create the first Fiddle
NuGet Url:

Install-Package Sophos.Commands
dotnet add package Sophos.Commands
paket add Sophos.Commands
Sophos.Commands Download (Unzip the "nupkg" after downloading)

.NETFramework 4.5
  • No dependencies.
.NETFramework 4.7
  • No dependencies.
.NETStandard 2.0
  • No dependencies.
  • No dependencies.
  • No dependencies.
  • No dependencies.
  • No dependencies.
  • No dependencies.
  • No dependencies.
  • No dependencies.
  • No dependencies.
  • No dependencies.