| name | azure-resource-manager-durabletask-dotnet |
| description | Azure Resource Manager SDK for Durable Task Scheduler in .NET. |
| risk | unknown |
| source | community |
| date_added | 2026-02-27 |
Azure.ResourceManager.DurableTask (.NET)
Management plane SDK for provisioning and managing Azure Durable Task Scheduler resources via Azure Resource Manager.
ā ļø Management vs Data Plane
- This SDK (Azure.ResourceManager.DurableTask): Create schedulers, task hubs, configure retention policies
- Data Plane SDK (Microsoft.DurableTask.Client.AzureManaged): Start orchestrations, query instances, send events
Installation
dotnet add package Azure.ResourceManager.DurableTask
dotnet add package Azure.Identity
Current Versions: Stable v1.0.0 (2025-11-03), Preview v1.0.0-beta.1 (2025-04-24)
API Version: 2025-11-01
Environment Variables
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_RESOURCE_GROUP=<your-resource-group>
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>
Authentication
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.DurableTask;
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
Resource Hierarchy
ArmClient
āāā SubscriptionResource
āāā ResourceGroupResource
āāā DurableTaskSchedulerResource
āāā DurableTaskHubResource
āāā DurableTaskRetentionPolicyResource
Core Workflow
1. Create Durable Task Scheduler
using Azure.ResourceManager.DurableTask;
using Azure.ResourceManager.DurableTask.Models;
var resourceGroup = await subscription
.GetResourceGroupAsync("my-resource-group");
var schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
Properties = new DurableTaskSchedulerProperties
{
Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
{
Capacity = 1
},
IPAllowlist = { "10.0.0.0/24", "192.168.1.0/24" }
}
};
var schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();
var operation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-scheduler",
schedulerData);
DurableTaskSchedulerResource scheduler = operation.Value;
Console.WriteLine($"Scheduler created: {scheduler.Data.Name}");
Console.WriteLine($"Endpoint: {scheduler.Data.Properties.Endpoint}");
2. Create Scheduler with Consumption SKU
var consumptionSchedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
Properties = new DurableTaskSchedulerProperties
{
Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Consumption)
}
};
var operation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-serverless-scheduler",
consumptionSchedulerData);
3. Create Task Hub
var taskHubData = new DurableTaskHubData
{
};
var taskHubCollection = scheduler.GetDurableTaskHubs();
var hubOperation = await taskHubCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-taskhub",
taskHubData);
DurableTaskHubResource taskHub = hubOperation.Value;
Console.WriteLine($"Task Hub created: {taskHub.Data.Name}");
4. List Schedulers
await foreach (var sched in subscription.GetDurableTaskSchedulersAsync())
{
Console.WriteLine($"Scheduler: {sched.Data.Name}");
Console.WriteLine($" Location: {sched.Data.Location}");
Console.WriteLine($" SKU: {sched.Data.Properties.Sku?.Name}");
Console.WriteLine($" Endpoint: {sched.Data.Properties.Endpoint}");
}
var schedulers = resourceGroup.Value.GetDurableTaskSchedulers();
await foreach (var sched in schedulers.GetAllAsync())
{
Console.WriteLine($"Scheduler: {sched.Data.Name}");
}
5. Get Scheduler by Name
var existingScheduler = await schedulerCollection.GetAsync("my-scheduler");
Console.WriteLine($"Found: {existingScheduler.Value.Data.Name}");
var schedulerResource = armClient.GetDurableTaskSchedulerResource(
DurableTaskSchedulerResource.CreateResourceIdentifier(
subscriptionId,
"my-resource-group",
"my-scheduler"));
var scheduler = await schedulerResource.GetAsync();
6. Update Scheduler
var scheduler = await schedulerCollection.GetAsync("my-scheduler");
var updateData = new DurableTaskSchedulerData(scheduler.Value.Data.Location)
{
Properties = new DurableTaskSchedulerProperties
{
Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
{
Capacity = 2
},
IPAllowlist = { "10.0.0.0/16" }
}
};
var updateOperation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-scheduler",
updateData);
7. Delete Resources
var taskHub = await scheduler.GetDurableTaskHubs().GetAsync("my-taskhub");
await taskHub.Value.DeleteAsync(WaitUntil.Completed);
await scheduler.DeleteAsync(WaitUntil.Completed);
8. Manage Retention Policies
var retentionPolicies = scheduler.GetDurableTaskRetentionPolicies();
var retentionData = new DurableTaskRetentionPolicyData
{
Properties = new DurableTaskRetentionPolicyProperties
{
}
};
var retentionOperation = await retentionPolicies.CreateOrUpdateAsync(
WaitUntil.Completed,
"default",
retentionData);
Key Types Reference
| Type | Purpose |
|---|
ArmClient | Entry point for all ARM operations |
DurableTaskSchedulerResource | Represents a Durable Task Scheduler |
DurableTaskSchedulerCollection | Collection for scheduler CRUD |
DurableTaskSchedulerData | Scheduler creation/update payload |
DurableTaskSchedulerProperties | Scheduler configuration (SKU, IPAllowlist) |
DurableTaskSchedulerSku | SKU configuration (Name, Capacity, RedundancyState) |
DurableTaskSchedulerSkuName | SKU options: Dedicated, Consumption |
DurableTaskHubResource | Represents a Task Hub |
DurableTaskHubCollection | Collection for task hub CRUD |
DurableTaskHubData | Task hub creation payload |
DurableTaskRetentionPolicyResource | Retention policy management |
DurableTaskRetentionPolicyData | Retention policy configuration |
DurableTaskExtensions | Extension methods for ARM client |
SKU Options
| SKU | Description | Use Case |
|---|
Dedicated | Fixed capacity with configurable instances | Production workloads, predictable performance |
Consumption | Serverless, auto-scaling | Development, variable workloads |
Extension Methods
The SDK provides extension methods on SubscriptionResource and ResourceGroupResource:
subscription.GetDurableTaskSchedulers();
subscription.GetDurableTaskSchedulersAsync();
resourceGroup.GetDurableTaskSchedulers();
resourceGroup.GetDurableTaskSchedulerAsync(name);
armClient.GetDurableTaskSchedulerResource(id);
armClient.GetDurableTaskHubResource(id);
Best Practices
- Use
WaitUntil.Completed for operations that must finish before proceeding
- Use
WaitUntil.Started when you want to poll manually or run operations in parallel
- Always use
DefaultAzureCredential ā never hardcode keys
- Handle
RequestFailedException for ARM API errors
- Use
CreateOrUpdateAsync for idempotent operations
- Delete task hubs before schedulers ā schedulers with task hubs cannot be deleted
- Use IP allowlists for network security in production
Error Handling
using Azure;
try
{
var operation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed, schedulerName, schedulerData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
Console.WriteLine("Scheduler already exists");
}
catch (RequestFailedException ex) when (ex.Status == 404)
{
Console.WriteLine("Resource group not found");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}
Complete Example
using Azure;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.DurableTask;
using Azure.ResourceManager.DurableTask.Models;
using Azure.ResourceManager.Resources;
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID")!;
var resourceGroupName = Environment.GetEnvironmentVariable("AZURE_RESOURCE_GROUP")!;
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
var resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);
var schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
Properties = new DurableTaskSchedulerProperties
{
Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
{
Capacity = 1
}
}
};
var schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();
var schedulerOp = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed, "my-scheduler", schedulerData);
var scheduler = schedulerOp.Value;
Console.WriteLine($"Scheduler endpoint: {scheduler.Data.Properties.Endpoint}");
var taskHubData = new DurableTaskHubData();
var taskHubOp = await scheduler.GetDurableTaskHubs().CreateOrUpdateAsync(
WaitUntil.Completed, "my-taskhub", taskHubData);
var taskHub = taskHubOp.Value;
Console.WriteLine($"Task Hub: {taskHub.Data.Name}");
await taskHub.DeleteAsync(WaitUntil.Completed);
await scheduler.DeleteAsync(WaitUntil.Completed);
Related SDKs
| SDK | Purpose | Install |
|---|
Azure.ResourceManager.DurableTask | Management plane (this SDK) | dotnet add package Azure.ResourceManager.DurableTask |
Microsoft.DurableTask.Client.AzureManaged | Data plane (orchestrations, activities) | dotnet add package Microsoft.DurableTask.Client.AzureManaged |
Microsoft.DurableTask.Worker.AzureManaged | Worker for running orchestrations | dotnet add package Microsoft.DurableTask.Worker.AzureManaged |
Azure.Identity | Authentication | dotnet add package Azure.Identity |
Azure.ResourceManager | Base ARM SDK | dotnet add package Azure.ResourceManager |
Source Reference
When to Use
This skill is applicable to execute the workflow or actions described in the overview.
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.