The conductor-csharp repository provides the client SDKs to build task workers in C#.
Building the task workers in C# mainly consists of the following steps:
- Setup
conductor-csharppackage - Create and run task workers
- Create workflows using code
- API Documentation
Show support for the Conductor OSS. Please help spread the awareness by starring Conductor repo.
If you don't already have a Conductor server running, start one with Docker:
docker run --init -p 8080:8080 conductoross/conductor:latestThe UI will be available at http://localhost:8080 and the API at http://localhost:8080/api.
dotnet add package conductor-csharpThis quickstart shows the full flow: define a worker, define a workflow, register it, run it.
Step 1: Create a new console project
dotnet new console -n conductor-hello
cd conductor-hello
dotnet add package conductor-csharpStep 2: Replace Program.cs with the following
using Conductor.Client;
using Conductor.Client.Extensions;
using Conductor.Client.Worker;
using Conductor.Definition;
using Conductor.Definition.TaskType;
using Conductor.Executor;
// Configure the SDK — reads CONDUCTOR_SERVER_URL from the environment,
// or falls back to a local server.
var configuration = new Configuration
{
BasePath = Environment.GetEnvironmentVariable("CONDUCTOR_SERVER_URL")
?? "http://localhost:8080/api"
};
// Define the workflow: one SIMPLE task called "greet".
var workflow = new ConductorWorkflow()
.WithName("greetings")
.WithVersion(1);
var greetTask = new SimpleTask("greet", "greet_ref")
.WithInput("name", workflow.Input("name"));
workflow.WithTask(greetTask);
// Register the workflow definition on the server.
var executor = new WorkflowExecutor(configuration);
executor.RegisterWorkflow(workflow, overwrite: true);
// Start the worker host — it discovers GreetWorker automatically.
var host = WorkflowTaskHost.CreateWorkerHost(
Microsoft.Extensions.Logging.LogLevel.Information,
new GreetWorker());
await host.StartAsync();
// Run the workflow and print the execution ID.
var workflowId = executor.StartWorkflow(new StartWorkflowRequest
{
Name = "greetings",
Version = 1,
Input = new Dictionary<string, object> { ["name"] = "Conductor" }
});
Console.WriteLine($"Started workflow: {workflowId}");
Console.WriteLine($"View execution: http://localhost:8080/execution/{workflowId}");
// Keep the worker running until Ctrl-C.
await host.WaitForShutdownAsync();Step 3: Add the worker class — create GreetWorker.cs
using Conductor.Client.Extensions;
using Conductor.Client.Interfaces;
using Conductor.Client.Models;
using Conductor.Client.Worker;
using Task = Conductor.Client.Models.Task;
public class GreetWorker : IWorkflowTask
{
public string TaskType => "greet";
public WorkflowTaskExecutorConfiguration WorkerSettings { get; } = new();
public TaskResult Execute(Task task)
{
var name = task.InputData.GetValueOrDefault("name")?.ToString() ?? "World";
var result = task.Completed();
result.OutputData = new Dictionary<string, object>
{
["greeting"] = $"Hello, {name}!"
};
return result;
}
}Step 4: Run it
dotnet runExpected output:
Started workflow: <workflow-id>
View execution: http://localhost:8080/execution/<workflow-id>
Open the UI link to see the completed execution and its output.
Configure the authentication settings if your Conductor server requires authentication.
- keyId: Key for authentication.
- keySecret: Secret for the key.
authenticationSettings: new OrkesAuthenticationSettings(
KeyId: "key",
KeySecret: "secret"
)See Access Control for more details on role-based access control with Conductor and generating API keys for your environment.
using Conductor.Api;
using Conductor.Client;
using Conductor.Client.Authentication;
var configuration = new Configuration() {
BasePath = basePath,
AuthenticationSettings = new OrkesAuthenticationSettings("keyId", "keySecret")
};
var workflowClient = configuration.GetClient<WorkflowResourceApi>();
workflowClient.StartWorkflow(
name: "test-sdk-csharp-workflow",
body: new Dictionary<string, object>(),
version: 1
)