[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XESSPEW3W4P41R6RZ22SWD":3,"skill-same:01M6XESSPEW3W4P41R6RZ22SWD":58},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":14,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":43,"install":44,"resources":57},"01M6XESSPEW3W4P41R6RZ22SWD","azure-resource-manager-durabletask-dotnet",null,"Azure Resource Manager SDK for Durable Task Scheduler in .NET.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fazure-resource-manager-durabletask-dotnet\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31],"dotnet","azure","azure resource manager durabletask dotnet","azure resource manager","manager","sdk","scheduler","community","task scheduler","task","for","unknown","2026","2026-11-10 10:12:30",false,"---\nname: azure-resource-manager-durabletask-dotnet\ndescription: Azure Resource Manager SDK for Durable Task Scheduler in .NET.\nrisk: unknown\nsource: community\ndate_added: '2026-02-27'\n---\n\n# Azure.ResourceManager.DurableTask (.NET)\n\nManagement plane SDK for provisioning and managing Azure Durable Task Scheduler resources via Azure Resource Manager.\n\n> **⚠️ Management vs Data Plane**\n> - **This SDK (Azure.ResourceManager.DurableTask)**: Create schedulers, task hubs, configure retention policies\n> - **Data Plane SDK (Microsoft.DurableTask.Client.AzureManaged)**: Start orchestrations, query instances, send events\n\n## Installation\n\n```bash\ndotnet add package Azure.ResourceManager.DurableTask\ndotnet add package Azure.Identity\n```\n\n**Current Versions**: Stable v1.0.0 (2025-11-03), Preview v1.0.0-beta.1 (2025-04-24)\n**API Version**: 2025-11-01\n\n## Environment Variables\n\n```bash\nAZURE_SUBSCRIPTION_ID=\u003Cyour-subscription-id>\nAZURE_RESOURCE_GROUP=\u003Cyour-resource-group>\n# For service principal auth (optional)\nAZURE_TENANT_ID=\u003Ctenant-id>\nAZURE_CLIENT_ID=\u003Cclient-id>\nAZURE_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.DurableTask;\n\n\u002F\u002F Always use DefaultAzureCredential\nvar credential = new DefaultAzureCredential();\nvar armClient = new ArmClient(credential);\n\n\u002F\u002F Get subscription\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\");\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\n```\n\n## Resource Hierarchy\n\n```\nArmClient\n└── SubscriptionResource\n    └── ResourceGroupResource\n        └── DurableTaskSchedulerResource\n            ├── DurableTaskHubResource\n            └── DurableTaskRetentionPolicyResource\n```\n\n## Core Workflow\n\n### 1. Create Durable Task Scheduler\n\n```csharp\nusing Azure.ResourceManager.DurableTask;\nusing Azure.ResourceManager.DurableTask.Models;\n\n\u002F\u002F Get resource group\nvar resourceGroup = await subscription\n    .GetResourceGroupAsync(\"my-resource-group\");\n\n\u002F\u002F Define scheduler with Dedicated SKU\nvar schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)\n        {\n            Capacity = 1  \u002F\u002F Number of instances\n        },\n        \u002F\u002F Optional: IP allowlist for network security\n        IPAllowlist = { \"10.0.0.0\u002F24\", \"192.168.1.0\u002F24\" }\n    }\n};\n\n\u002F\u002F Create scheduler (long-running operation)\nvar schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();\nvar operation = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-scheduler\",\n    schedulerData);\n\nDurableTaskSchedulerResource scheduler = operation.Value;\nConsole.WriteLine($\"Scheduler created: {scheduler.Data.Name}\");\nConsole.WriteLine($\"Endpoint: {scheduler.Data.Properties.Endpoint}\");\n```\n\n### 2. Create Scheduler with Consumption SKU\n\n```csharp\n\u002F\u002F Consumption SKU (serverless)\nvar consumptionSchedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Consumption)\n        \u002F\u002F No capacity needed for consumption\n    }\n};\n\nvar operation = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-serverless-scheduler\",\n    consumptionSchedulerData);\n```\n\n### 3. Create Task Hub\n\n```csharp\n\u002F\u002F Task hubs are created under a scheduler\nvar taskHubData = new DurableTaskHubData\n{\n    \u002F\u002F Properties are optional for basic task hub\n};\n\nvar taskHubCollection = scheduler.GetDurableTaskHubs();\nvar hubOperation = await taskHubCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-taskhub\",\n    taskHubData);\n\nDurableTaskHubResource taskHub = hubOperation.Value;\nConsole.WriteLine($\"Task Hub created: {taskHub.Data.Name}\");\n```\n\n### 4. List Schedulers\n\n```csharp\n\u002F\u002F List all schedulers in subscription\nawait foreach (var sched in subscription.GetDurableTaskSchedulersAsync())\n{\n    Console.WriteLine($\"Scheduler: {sched.Data.Name}\");\n    Console.WriteLine($\"  Location: {sched.Data.Location}\");\n    Console.WriteLine($\"  SKU: {sched.Data.Properties.Sku?.Name}\");\n    Console.WriteLine($\"  Endpoint: {sched.Data.Properties.Endpoint}\");\n}\n\n\u002F\u002F List schedulers in resource group\nvar schedulers = resourceGroup.Value.GetDurableTaskSchedulers();\nawait foreach (var sched in schedulers.GetAllAsync())\n{\n    Console.WriteLine($\"Scheduler: {sched.Data.Name}\");\n}\n```\n\n### 5. Get Scheduler by Name\n\n```csharp\n\u002F\u002F Get existing scheduler\nvar existingScheduler = await schedulerCollection.GetAsync(\"my-scheduler\");\nConsole.WriteLine($\"Found: {existingScheduler.Value.Data.Name}\");\n\n\u002F\u002F Or use extension method\nvar schedulerResource = armClient.GetDurableTaskSchedulerResource(\n    DurableTaskSchedulerResource.CreateResourceIdentifier(\n        subscriptionId,\n        \"my-resource-group\",\n        \"my-scheduler\"));\nvar scheduler = await schedulerResource.GetAsync();\n```\n\n### 6. Update Scheduler\n\n```csharp\n\u002F\u002F Get current scheduler\nvar scheduler = await schedulerCollection.GetAsync(\"my-scheduler\");\n\n\u002F\u002F Update with new configuration\nvar updateData = new DurableTaskSchedulerData(scheduler.Value.Data.Location)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)\n        {\n            Capacity = 2  \u002F\u002F Scale up\n        },\n        IPAllowlist = { \"10.0.0.0\u002F16\" }  \u002F\u002F Update IP allowlist\n    }\n};\n\nvar updateOperation = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-scheduler\",\n    updateData);\n```\n\n### 7. Delete Resources\n\n```csharp\n\u002F\u002F Delete task hub first\nvar taskHub = await scheduler.GetDurableTaskHubs().GetAsync(\"my-taskhub\");\nawait taskHub.Value.DeleteAsync(WaitUntil.Completed);\n\n\u002F\u002F Then delete scheduler\nawait scheduler.DeleteAsync(WaitUntil.Completed);\n```\n\n### 8. Manage Retention Policies\n\n```csharp\n\u002F\u002F Get retention policy collection\nvar retentionPolicies = scheduler.GetDurableTaskRetentionPolicies();\n\n\u002F\u002F Create or update retention policy\nvar retentionData = new DurableTaskRetentionPolicyData\n{\n    Properties = new DurableTaskRetentionPolicyProperties\n    {\n        \u002F\u002F Configure retention settings\n    }\n};\n\nvar retentionOperation = await retentionPolicies.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"default\",  \u002F\u002F Policy name\n    retentionData);\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ArmClient` | Entry point for all ARM operations |\n| `DurableTaskSchedulerResource` | Represents a Durable Task Scheduler |\n| `DurableTaskSchedulerCollection` | Collection for scheduler CRUD |\n| `DurableTaskSchedulerData` | Scheduler creation\u002Fupdate payload |\n| `DurableTaskSchedulerProperties` | Scheduler configuration (SKU, IPAllowlist) |\n| `DurableTaskSchedulerSku` | SKU configuration (Name, Capacity, RedundancyState) |\n| `DurableTaskSchedulerSkuName` | SKU options: `Dedicated`, `Consumption` |\n| `DurableTaskHubResource` | Represents a Task Hub |\n| `DurableTaskHubCollection` | Collection for task hub CRUD |\n| `DurableTaskHubData` | Task hub creation payload |\n| `DurableTaskRetentionPolicyResource` | Retention policy management |\n| `DurableTaskRetentionPolicyData` | Retention policy configuration |\n| `DurableTaskExtensions` | Extension methods for ARM client |\n\n## SKU Options\n\n| SKU | Description | Use Case |\n|-----|-------------|----------|\n| `Dedicated` | Fixed capacity with configurable instances | Production workloads, predictable performance |\n| `Consumption` | Serverless, auto-scaling | Development, variable workloads |\n\n## Extension Methods\n\nThe SDK provides extension methods on `SubscriptionResource` and `ResourceGroupResource`:\n\n```csharp\n\u002F\u002F On SubscriptionResource\nsubscription.GetDurableTaskSchedulers();           \u002F\u002F List all in subscription\nsubscription.GetDurableTaskSchedulersAsync();      \u002F\u002F Async enumerable\n\n\u002F\u002F On ResourceGroupResource  \nresourceGroup.GetDurableTaskSchedulers();          \u002F\u002F Get collection\nresourceGroup.GetDurableTaskSchedulerAsync(name);  \u002F\u002F Get by name\n\n\u002F\u002F On ArmClient\narmClient.GetDurableTaskSchedulerResource(id);     \u002F\u002F Get by resource ID\narmClient.GetDurableTaskHubResource(id);           \u002F\u002F Get task hub by ID\n```\n\n## Best Practices\n\n1. **Use `WaitUntil.Completed`** for operations that must finish before proceeding\n2. **Use `WaitUntil.Started`** when you want to poll manually or run operations in parallel\n3. **Always use `DefaultAzureCredential`** — never hardcode keys\n4. **Handle `RequestFailedException`** for ARM API errors\n5. **Use `CreateOrUpdateAsync`** for idempotent operations\n6. **Delete task hubs before schedulers** — schedulers with task hubs cannot be deleted\n7. **Use IP allowlists** for network security in production\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var operation = await schedulerCollection.CreateOrUpdateAsync(\n        WaitUntil.Completed, schedulerName, schedulerData);\n}\ncatch (RequestFailedException ex) when (ex.Status == 409)\n{\n    Console.WriteLine(\"Scheduler already exists\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 404)\n{\n    Console.WriteLine(\"Resource group not found\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Complete Example\n\n```csharp\nusing Azure;\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.DurableTask;\nusing Azure.ResourceManager.DurableTask.Models;\nusing Azure.ResourceManager.Resources;\n\n\u002F\u002F Setup\nvar credential = new DefaultAzureCredential();\nvar armClient = new ArmClient(credential);\n\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\")!;\nvar resourceGroupName = Environment.GetEnvironmentVariable(\"AZURE_RESOURCE_GROUP\")!;\n\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\nvar resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);\n\n\u002F\u002F Create scheduler\nvar schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)\n        {\n            Capacity = 1\n        }\n    }\n};\n\nvar schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();\nvar schedulerOp = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed, \"my-scheduler\", schedulerData);\nvar scheduler = schedulerOp.Value;\n\nConsole.WriteLine($\"Scheduler endpoint: {scheduler.Data.Properties.Endpoint}\");\n\n\u002F\u002F Create task hub\nvar taskHubData = new DurableTaskHubData();\nvar taskHubOp = await scheduler.GetDurableTaskHubs().CreateOrUpdateAsync(\n    WaitUntil.Completed, \"my-taskhub\", taskHubData);\nvar taskHub = taskHubOp.Value;\n\nConsole.WriteLine($\"Task Hub: {taskHub.Data.Name}\");\n\n\u002F\u002F Cleanup\nawait taskHub.DeleteAsync(WaitUntil.Completed);\nawait scheduler.DeleteAsync(WaitUntil.Completed);\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.ResourceManager.DurableTask` | Management plane (this SDK) | `dotnet add package Azure.ResourceManager.DurableTask` |\n| `Microsoft.DurableTask.Client.AzureManaged` | Data plane (orchestrations, activities) | `dotnet add package Microsoft.DurableTask.Client.AzureManaged` |\n| `Microsoft.DurableTask.Worker.AzureManaged` | Worker for running orchestrations | `dotnet add package Microsoft.DurableTask.Worker.AzureManaged` |\n| `Azure.Identity` | Authentication | `dotnet add package Azure.Identity` |\n| `Azure.ResourceManager` | Base ARM SDK | `dotnet add package Azure.ResourceManager` |\n\n## Source Reference\n\n- [GitHub: Azure.ResourceManager.DurableTask](https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fdurabletask\u002FAzure.ResourceManager.DurableTask)\n- [NuGet: Azure.ResourceManager.DurableTask](https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.ResourceManager.DurableTask)\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n","# Azure.ResourceManager.DurableTask (.NET)\n\nManagement plane SDK for provisioning and managing Azure Durable Task Scheduler resources via Azure Resource Manager.\n\n> **⚠️ Management vs Data Plane**\n> - **This SDK (Azure.ResourceManager.DurableTask)**: Create schedulers, task hubs, configure retention policies\n> - **Data Plane SDK (Microsoft.DurableTask.Client.AzureManaged)**: Start orchestrations, query instances, send events\n\n## Installation\n\n```bash\ndotnet add package Azure.ResourceManager.DurableTask\ndotnet add package Azure.Identity\n```\n\n**Current Versions**: Stable v1.0.0 (2025-11-03), Preview v1.0.0-beta.1 (2025-04-24)\n**API Version**: 2025-11-01\n\n## Environment Variables\n\n```bash\nAZURE_SUBSCRIPTION_ID=\u003Cyour-subscription-id>\nAZURE_RESOURCE_GROUP=\u003Cyour-resource-group>\n# For service principal auth (optional)\nAZURE_TENANT_ID=\u003Ctenant-id>\nAZURE_CLIENT_ID=\u003Cclient-id>\nAZURE_CLIENT_SECRET=\u003Cclient-secret>\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.DurableTask;\n\n\u002F\u002F Always use DefaultAzureCredential\nvar credential = new DefaultAzureCredential();\nvar armClient = new ArmClient(credential);\n\n\u002F\u002F Get subscription\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\");\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\n```\n\n## Resource Hierarchy\n\n```\nArmClient\n└── SubscriptionResource\n    └── ResourceGroupResource\n        └── DurableTaskSchedulerResource\n            ├── DurableTaskHubResource\n            └── DurableTaskRetentionPolicyResource\n```\n\n## Core Workflow\n\n### 1. Create Durable Task Scheduler\n\n```csharp\nusing Azure.ResourceManager.DurableTask;\nusing Azure.ResourceManager.DurableTask.Models;\n\n\u002F\u002F Get resource group\nvar resourceGroup = await subscription\n    .GetResourceGroupAsync(\"my-resource-group\");\n\n\u002F\u002F Define scheduler with Dedicated SKU\nvar schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)\n        {\n            Capacity = 1  \u002F\u002F Number of instances\n        },\n        \u002F\u002F Optional: IP allowlist for network security\n        IPAllowlist = { \"10.0.0.0\u002F24\", \"192.168.1.0\u002F24\" }\n    }\n};\n\n\u002F\u002F Create scheduler (long-running operation)\nvar schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();\nvar operation = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-scheduler\",\n    schedulerData);\n\nDurableTaskSchedulerResource scheduler = operation.Value;\nConsole.WriteLine($\"Scheduler created: {scheduler.Data.Name}\");\nConsole.WriteLine($\"Endpoint: {scheduler.Data.Properties.Endpoint}\");\n```\n\n### 2. Create Scheduler with Consumption SKU\n\n```csharp\n\u002F\u002F Consumption SKU (serverless)\nvar consumptionSchedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Consumption)\n        \u002F\u002F No capacity needed for consumption\n    }\n};\n\nvar operation = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-serverless-scheduler\",\n    consumptionSchedulerData);\n```\n\n### 3. Create Task Hub\n\n```csharp\n\u002F\u002F Task hubs are created under a scheduler\nvar taskHubData = new DurableTaskHubData\n{\n    \u002F\u002F Properties are optional for basic task hub\n};\n\nvar taskHubCollection = scheduler.GetDurableTaskHubs();\nvar hubOperation = await taskHubCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-taskhub\",\n    taskHubData);\n\nDurableTaskHubResource taskHub = hubOperation.Value;\nConsole.WriteLine($\"Task Hub created: {taskHub.Data.Name}\");\n```\n\n### 4. List Schedulers\n\n```csharp\n\u002F\u002F List all schedulers in subscription\nawait foreach (var sched in subscription.GetDurableTaskSchedulersAsync())\n{\n    Console.WriteLine($\"Scheduler: {sched.Data.Name}\");\n    Console.WriteLine($\"  Location: {sched.Data.Location}\");\n    Console.WriteLine($\"  SKU: {sched.Data.Properties.Sku?.Name}\");\n    Console.WriteLine($\"  Endpoint: {sched.Data.Properties.Endpoint}\");\n}\n\n\u002F\u002F List schedulers in resource group\nvar schedulers = resourceGroup.Value.GetDurableTaskSchedulers();\nawait foreach (var sched in schedulers.GetAllAsync())\n{\n    Console.WriteLine($\"Scheduler: {sched.Data.Name}\");\n}\n```\n\n### 5. Get Scheduler by Name\n\n```csharp\n\u002F\u002F Get existing scheduler\nvar existingScheduler = await schedulerCollection.GetAsync(\"my-scheduler\");\nConsole.WriteLine($\"Found: {existingScheduler.Value.Data.Name}\");\n\n\u002F\u002F Or use extension method\nvar schedulerResource = armClient.GetDurableTaskSchedulerResource(\n    DurableTaskSchedulerResource.CreateResourceIdentifier(\n        subscriptionId,\n        \"my-resource-group\",\n        \"my-scheduler\"));\nvar scheduler = await schedulerResource.GetAsync();\n```\n\n### 6. Update Scheduler\n\n```csharp\n\u002F\u002F Get current scheduler\nvar scheduler = await schedulerCollection.GetAsync(\"my-scheduler\");\n\n\u002F\u002F Update with new configuration\nvar updateData = new DurableTaskSchedulerData(scheduler.Value.Data.Location)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)\n        {\n            Capacity = 2  \u002F\u002F Scale up\n        },\n        IPAllowlist = { \"10.0.0.0\u002F16\" }  \u002F\u002F Update IP allowlist\n    }\n};\n\nvar updateOperation = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"my-scheduler\",\n    updateData);\n```\n\n### 7. Delete Resources\n\n```csharp\n\u002F\u002F Delete task hub first\nvar taskHub = await scheduler.GetDurableTaskHubs().GetAsync(\"my-taskhub\");\nawait taskHub.Value.DeleteAsync(WaitUntil.Completed);\n\n\u002F\u002F Then delete scheduler\nawait scheduler.DeleteAsync(WaitUntil.Completed);\n```\n\n### 8. Manage Retention Policies\n\n```csharp\n\u002F\u002F Get retention policy collection\nvar retentionPolicies = scheduler.GetDurableTaskRetentionPolicies();\n\n\u002F\u002F Create or update retention policy\nvar retentionData = new DurableTaskRetentionPolicyData\n{\n    Properties = new DurableTaskRetentionPolicyProperties\n    {\n        \u002F\u002F Configure retention settings\n    }\n};\n\nvar retentionOperation = await retentionPolicies.CreateOrUpdateAsync(\n    WaitUntil.Completed,\n    \"default\",  \u002F\u002F Policy name\n    retentionData);\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ArmClient` | Entry point for all ARM operations |\n| `DurableTaskSchedulerResource` | Represents a Durable Task Scheduler |\n| `DurableTaskSchedulerCollection` | Collection for scheduler CRUD |\n| `DurableTaskSchedulerData` | Scheduler creation\u002Fupdate payload |\n| `DurableTaskSchedulerProperties` | Scheduler configuration (SKU, IPAllowlist) |\n| `DurableTaskSchedulerSku` | SKU configuration (Name, Capacity, RedundancyState) |\n| `DurableTaskSchedulerSkuName` | SKU options: `Dedicated`, `Consumption` |\n| `DurableTaskHubResource` | Represents a Task Hub |\n| `DurableTaskHubCollection` | Collection for task hub CRUD |\n| `DurableTaskHubData` | Task hub creation payload |\n| `DurableTaskRetentionPolicyResource` | Retention policy management |\n| `DurableTaskRetentionPolicyData` | Retention policy configuration |\n| `DurableTaskExtensions` | Extension methods for ARM client |\n\n## SKU Options\n\n| SKU | Description | Use Case |\n|-----|-------------|----------|\n| `Dedicated` | Fixed capacity with configurable instances | Production workloads, predictable performance |\n| `Consumption` | Serverless, auto-scaling | Development, variable workloads |\n\n## Extension Methods\n\nThe SDK provides extension methods on `SubscriptionResource` and `ResourceGroupResource`:\n\n```csharp\n\u002F\u002F On SubscriptionResource\nsubscription.GetDurableTaskSchedulers();           \u002F\u002F List all in subscription\nsubscription.GetDurableTaskSchedulersAsync();      \u002F\u002F Async enumerable\n\n\u002F\u002F On ResourceGroupResource  \nresourceGroup.GetDurableTaskSchedulers();          \u002F\u002F Get collection\nresourceGroup.GetDurableTaskSchedulerAsync(name);  \u002F\u002F Get by name\n\n\u002F\u002F On ArmClient\narmClient.GetDurableTaskSchedulerResource(id);     \u002F\u002F Get by resource ID\narmClient.GetDurableTaskHubResource(id);           \u002F\u002F Get task hub by ID\n```\n\n## Best Practices\n\n1. **Use `WaitUntil.Completed`** for operations that must finish before proceeding\n2. **Use `WaitUntil.Started`** when you want to poll manually or run operations in parallel\n3. **Always use `DefaultAzureCredential`** — never hardcode keys\n4. **Handle `RequestFailedException`** for ARM API errors\n5. **Use `CreateOrUpdateAsync`** for idempotent operations\n6. **Delete task hubs before schedulers** — schedulers with task hubs cannot be deleted\n7. **Use IP allowlists** for network security in production\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var operation = await schedulerCollection.CreateOrUpdateAsync(\n        WaitUntil.Completed, schedulerName, schedulerData);\n}\ncatch (RequestFailedException ex) when (ex.Status == 409)\n{\n    Console.WriteLine(\"Scheduler already exists\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 404)\n{\n    Console.WriteLine(\"Resource group not found\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Complete Example\n\n```csharp\nusing Azure;\nusing Azure.Identity;\nusing Azure.ResourceManager;\nusing Azure.ResourceManager.DurableTask;\nusing Azure.ResourceManager.DurableTask.Models;\nusing Azure.ResourceManager.Resources;\n\n\u002F\u002F Setup\nvar credential = new DefaultAzureCredential();\nvar armClient = new ArmClient(credential);\n\nvar subscriptionId = Environment.GetEnvironmentVariable(\"AZURE_SUBSCRIPTION_ID\")!;\nvar resourceGroupName = Environment.GetEnvironmentVariable(\"AZURE_RESOURCE_GROUP\")!;\n\nvar subscription = armClient.GetSubscriptionResource(\n    new ResourceIdentifier($\"\u002Fsubscriptions\u002F{subscriptionId}\"));\nvar resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);\n\n\u002F\u002F Create scheduler\nvar schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)\n{\n    Properties = new DurableTaskSchedulerProperties\n    {\n        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)\n        {\n            Capacity = 1\n        }\n    }\n};\n\nvar schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();\nvar schedulerOp = await schedulerCollection.CreateOrUpdateAsync(\n    WaitUntil.Completed, \"my-scheduler\", schedulerData);\nvar scheduler = schedulerOp.Value;\n\nConsole.WriteLine($\"Scheduler endpoint: {scheduler.Data.Properties.Endpoint}\");\n\n\u002F\u002F Create task hub\nvar taskHubData = new DurableTaskHubData();\nvar taskHubOp = await scheduler.GetDurableTaskHubs().CreateOrUpdateAsync(\n    WaitUntil.Completed, \"my-taskhub\", taskHubData);\nvar taskHub = taskHubOp.Value;\n\nConsole.WriteLine($\"Task Hub: {taskHub.Data.Name}\");\n\n\u002F\u002F Cleanup\nawait taskHub.DeleteAsync(WaitUntil.Completed);\nawait scheduler.DeleteAsync(WaitUntil.Completed);\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.ResourceManager.DurableTask` | Management plane (this SDK) | `dotnet add package Azure.ResourceManager.DurableTask` |\n| `Microsoft.DurableTask.Client.AzureManaged` | Data plane (orchestrations, activities) | `dotnet add package Microsoft.DurableTask.Client.AzureManaged` |\n| `Microsoft.DurableTask.Worker.AzureManaged` | Worker for running orchestrations | `dotnet add package Microsoft.DurableTask.Worker.AzureManaged` |\n| `Azure.Identity` | Authentication | `dotnet add package Azure.Identity` |\n| `Azure.ResourceManager` | Base ARM SDK | `dotnet add package Azure.ResourceManager` |\n\n## Source Reference\n\n- [GitHub: Azure.ResourceManager.DurableTask](https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fdurabletask\u002FAzure.ResourceManager.DurableTask)\n- [NuGet: Azure.ResourceManager.DurableTask](https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.ResourceManager.DurableTask)\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{"name":5,"risk":30,"source":26,"date_added":37,"description":7},"2026-02-27","main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fcopilot\u002Fazure-resource-manager-durabletask-dotnet","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill azure-resource-manager-durabletask-dotnet",{"tool":50,"command":51},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill azure-resource-manager-durabletask-dotnet",{"tool":53,"command":54},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill azure-resource-manager-durabletask-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fazure-resource-manager-durabletask-dotnet\u002FSKILL.md",true,[],[59,83,109,119,132,151],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":70,"publishedAt":32},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[65],{"categoryNo":66,"categoryName":67,"taxonomyType":68,"taxonomyTypeDesc":69},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[71,72,73,74,75,76,77,78,79,80,81,82],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":32},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[90,91,92,93,94,95,73,96,97,98,99,100,101,102,103,104,105,106,107,108],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across","api",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":32},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[116,117,90,101,102,103,104,94,73,106,118,107,108,100,98,97,96,105,95,93],"trend radar","radar","pulse",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":32},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[126,127,128,129,130,131],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":143,"publishedAt":32},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[138],{"categoryNo":139,"categoryName":140,"taxonomyType":141,"taxonomyTypeDesc":142},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[134,79,144,145,146,82,101,147,148,149,92,150,105],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":32},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[153,158,159,160,105,161,148,162,163,164,165,166],"status","play","go","latest","github","discover","control","cmd","volume"]