Skip to content

Releases: temporalio/sdk-dotnet

1.7.0

09 Jun 15:05
21ae81b
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

Workflow & Activity Priorities

Users can now set a priority key when scheduling a workflow, activity or child workflows. The priority key will be used to help prioritize certain tasks over others when there is a backlog. Priority is currently not supported in any OSS Temporal release, but support will be coming soon. To experiment with this feature please see the pre-release development server or if you are a Temporal Cloud customer reach out to your SA.

Worker deployment versioning preview

This release introduces a preview of new APIs that gracefully manage code changes and worker pools that support them. The goal is to better control which workers should execute new, and existing, workflows and activities tasks, based on their code and configuration.

VersioningBehavior.AutoUpgrade and VersioningBehavior.Pinned are two Versioning Behaviors that can be specified on a workflow implementation using the VersioningBehavior argument to the Workflow attribute. Pinned workflows are typically short lived, and are never affected by new versions, i.e., they do not need to use the patch API for compatibility. AutoUpgrade workflows are mostly long running, but they need to use patching to safely transition to new versions. The choice of Pinned vs AutoUpgrade ultimately depends on your willingness to keep old worker fleets running vs the complexity of patching.

To manage Worker Deployments please use the Temporal CLI, or Temporalio.Client.WorkflowService

Automatic Poller Scaling

You can configure Workers to automatically adjust the number of concurrent polls they make for tasks! Set the WorkflowTaskPollerBehavior and ActivityTaskPollerBehavior arguments of the Worker options to PollerBehavior.Autoscaling to try it out. You can expect fewer unnecessary polls during low load, and increased polls during high load when they can be used to increase task throughput.

Activity pause support

Activity pausing (not GA currently) will now cancel the activity cancellation token thereby interrupting activity execution similar to how activity cancel and worker shut down does. There is a new CancellationDetails property on the ActivityExecutionContext that provides the reason for cancellation token being set.

Specific Changes

2025-04-28 - 98db10f - Add CODEOWNERS (#467)
2025-04-28 - d48377d - Handle errors with update result serialization (#468)
2025-04-28 - dcf7e1c - Replace BuildJet in build-binary smoke test (#469)
2025-05-08 - 1890573 - Fail the workflow task if a requested local activity is not registered (#472)
2025-05-14 - 4205a59 - Expose poller automation (#477)
2025-05-14 - cbf20f9 - Worker Deployment Versioning (#466)
2025-05-16 - 910fb1c - Improve/verbosify error messages in various ToInteropOptions methods (#481)
2025-05-19 - 8918a31 - Properly restore auto-time-skipping after disabled (#475)
2025-05-19 - b94084b - Add WorkflowInfo.WorkflowStartTime (#476)
2025-05-27 - 864e654 - Activity pause support (#482)
2025-05-29 - fa93167 - Added Category to ApplicationFailureException (#483)
2025-06-06 - 761465d - Updated sdk-core to latest (#485)
2025-06-06 - a7ca5ec - Make static summary/details lazy on workflow description (#486)

1.6.0

21 Apr 13:52
464b895
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

New Event Loop Algorithm

A significant change was made to the event loop internals to allow for proper expectations on tasks and wait conditions. Specifically for most users, the biggest difference is that only one WaitConditionAsync will be resolved at a time before the tasks continue. So now if you have multiple coroutines/tasks with:

await Workflow.WaitConditionAsync(() => !locked);
locked = true;

That kind of a mutex now works, whereas before it would wake up all wait conditions at once. So before you could not guarantee that the wait condition was satisfied on the line after the wait condition, but now you can.

This change can cause backwards incompatible history, so we took care to make sure past workflows still use the previous algorithm. See #432 for more details.

💥 BREAKING CHANGE - Removed assumed use-worker-versioning in DI when build ID present

This is a breaking change only for those that used non-GA versioning and use build IDs specifically in their AddHostedTemporalWorker calls. We previously assumed that the simple presence of a build ID was enough to opt-in to this non-GA versioning (which is being replaced with a newer form of versioning anyways). We now no longer assume this, so for any users relying on this unstable form of versioning, UseWorkerVersioning worker option will have to be explicitly set to true instead of relying on it being done implicitly when build ID is present.

This only affects a very small subset of users trying out a pre-release form of versioning. See #432 for more details.

MUSL-based Builds Supported

We now publish Linux-musl builds for x64 to NuGet which means users can use Alpine-based .NET docker images.

Serialization Context Available For Converters/Codecs

Payload converters, failure converters, and payload codecs can now implement IWithSerializationContext that will have WithSerializationContext called when needing to do context-specific conversion for workflows or activities. A common use case for this is to allow codecs to have different encryption keys per workflow ID or namespace. See #446 for more details.

Specific Changes

2025-02-28 - bbbfad1 - Add advanced signal-handling tests (#418)
2025-03-17 - 612fe2f - Use RawValue for built-in query response (#424)
2025-03-17 - 7829fd3 - Allow unaltered payload response from codec (#425)
2025-03-18 - 8631656 - add protected constructors for metric instrumentation in Temporalio.Common namespace (#431)
2025-03-18 - fc0fd7b - change readme activity examples from scheduletoclose to starttoclose (#433)
2025-03-19 - bac42d3 - Apply modern event loop algorithm with new SDK flag (#432)
2025-04-09 - 5cb605e - Add Workflow.Unsafe.WithTracingEventListenerDisabled (#443)
2025-04-09 - 9ac9d69 - Increase visibility on some client constructs and minor docs updates (#434)
2025-04-10 - 0ef89ac - Add ActivityDefinition.CreateWithoutAttribute overload (#451)
2025-04-10 - 409e53f - Remove assumed use-worker-versioning in DI when build ID present (#452)
2025-04-10 - 6c2a78f - Provide MUSL-based build (#447)
2025-04-10 - fc4ea01 - Allow absent payloads on some responses (#449)
2025-04-15 - 6dbf752 - Serialization context for converters and codecs (#446)
2025-04-16 - 6a0eb69 - Update Core (with changes needed) and update version to 1.6.0 (#453)
2025-04-17 - 464b895 - Custom histogram metric buckets (#456)
2025-04-17 - 4fed10a - Expose root execution (#454)
2025-04-17 - 5531bfe - proposed readme nits (#455)

1.5.0

13 Feb 15:49
d01bacc
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

Search Attributes in Dev Server

To make testing easier, Temporalio.Testing.WorkflowEnvironment.StartLocalAsync now accepts SearchAttributes in its options to start the server with pre-created search attributes.

Client in Activity

It is a common use case to use a Temporal client in an activity. TemporalClient is now available on the Temporalio.Activities.ActivityExecutionContext to make this easier.

Activity Service Scope

For those using dependency injection, Temporalio.Extensions.Hosting.ActivityScope is now available which provides access to both the activity instance and IServiceScope to have access to the service provider in the activity or activity interceptor.

Specific Changes

2025-01-16 - 3dd6cca - Expose instance to workflows/activities and client to activities (#393)
2025-01-24 - b5ca854 - Accept search attributes for dev server (#289)
2025-02-03 - 69dfe5a - Updated the docs for IdReusePolicy property (#397)
2025-02-03 - 7b92674 - Fix issue where null timer summary breaks codec (#405)
2025-02-05 - 139a853 - Update Core & add HTTP Otel / Dev UI Port (#407)
2025-02-11 - 2b97703 - Document CA issues in AWS and Azure (#411)
2025-02-11 - f2ba7dd - Reserve __temporal prefix (#410)

1.4.0

19 Dec 15:48
9673804
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

Custom Slot Suppliers in Worker Tuners (experimental)

Worker tuners can now be created with custom slot suppliers. By providing a class extending Temporalio.Worker.Tuning.CustomSlotSupplier to a worker tuner, users can now control logic of when slots are available for use by the worker. This allows advanced, dynamic control over in-process tuning for how many concurrent activities, local activities, and workflow tasks can run. This is an advanced feature and is currently experimental which means future releases can technically update the API in incompatible ways.

User Metadata (experimental)

When starting workflows (directly, via update with start, via schedules, or via child workflows), users can now set a StaticSummary and/or StaticDetails option which may appear in the UI/CLI in the future. Similarly, users can provide Summary to timers and activity invocations. Finally, users can set the Workflow.CurrentDetails property to a string that can updated be throughout the life of the workflow based on the workflow's state. This value may also appear in the UI/CLI in the future. Values for summary or details can be in limited single-line or multi-line markdown format, respectively. This feature is currently experimental which means future releases can technically update the API in incompatible ways.

Update with Start Workflow (experimental)

Users can use StartUpdateWithStartWorkflowAsync or ExecuteUpdateWithStartWorkflowAsync on newer servers to perform an update with start. An update with start first starts a workflow if it does not exist (subject to conflict policy), and regardless of whether it started a workflow or not, sends an update. Depending on the call made, it either waits for the update to reach the worker/workflow, or waits for the update to complete. This is a very useful feature for those wanting to start a workflow and get back an early programmatic result but still let the rest of the workflow continue in the background. This feature is currently experimental which means future releases can technically update the API in incompatible ways.

Workflow Update No Longer Experimental

The "experimental" label has been removed from workflow update and it is no longer considered experimental.

Specific Changes

2024-10-08 - 6006744 - Add update ID and name in log scope (#355)
2024-10-08 - b33105e - Disallow open generics on activity methods (#354)
2024-10-08 - d505adc - Detached cancellation test (#352)
2024-10-08 - fb3c991 - Support failed completion building for activity (#353)
2024-10-31 - 6a858a2 - Upgrade dependency and add .NET 8 in one CI (#356)
2024-11-04 - 46410a6 - Update Rust dependencies and move to macos-13 in CI (#362)
2024-11-22 - 2400644 - Support DisableEagerActivityExecution option (#366)
2024-11-22 - c30a2db - Update Microsoft.Extensions.Hosting and other CI failure fixes (#370)
2024-11-25 - fe86f77 - Store MethodInfo when creating an ActivityDefinition (#369)
2024-12-04 - c219615 - Update Core (#376)
2024-12-05 - 15a3142 - Custom slot suplier (#372)
2024-12-06 - 66436bf - Add limit to list workflows (#377)
2024-12-11 - 2546f07 - User metadata and workflow metadata support (#378)
2024-12-11 - 301062a - Fix child workflow already exists and minor README updates (#379)
2024-12-11 - aac363d - Fix CI after GHA's drop of node16 actions (#374)
2024-12-13 - d073176 - Remove "experimental" tag from workflow update (#380)
2024-12-17 - 855047e - Update with start (#381)

1.3.1

11 Sep 14:03
5141c2c
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

This is mostly bugfix release meant to address:

  • Unable to send OpenTelemetry metrics over TLS
  • Sporadic activity completion RPC cancellation

Specific Changes

2024-08-26 - aa3edef - Fix HTTP CONNECT proxy options not passing to core (#336)
2024-08-29 - 76e01fc - Fix BasicAuth bug in HttpConnectProxyOptions.ToInteropOptions() (#334)
2024-08-30 - 1985158 - Custom features repo branch in CI until after 1.3.0 (#338)
2024-08-30 - 622eda1 - Fix cloud CI run and minor doc fix (#339)
2024-09-03 - 681cd01 - Fix incorrect dep line (#341)
2024-09-05 - ec8821d - Properly clear metadata when encoding/decoding payloads (#343)
2024-09-06 - 73eaf2b - Moved info about WorkflowAlreadyStartedException into the right position in XML docs (#309)
2024-09-11 - 5141c2c - Update core and update version to 1.3.1 (#344)

1.3.0

14 Aug 13:35
973257a
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

Warn on Unfinished Workflow Handlers

Previously if you had a signal handler or update handler that was not complete when the workflow was marked complete,
it'd silently be ignored/abandoned. Now you will get a warning. Users are encouraged to add
await Workflow.WaitConditionAsync(() => Workflow.AllHandlersFinished); to the bottom of their workflow to ensure they
have no outstanding handlers. If the previous no-warn situation is preferred, the signal/update attribute has a setting
to just abandon.

New Deterministic Async Helpers

While many Task based calls are safe for use in workflows (e.g. Task.WhenAll) there are some that are not (e.g.
Task.Run). So instead of only having some safe implementations of these and documenting others are safe, we wrapped
multiple in general. Some were added this release, so overall the set is:

  • Workflow.DelayAsync - Safe form of Task.Delay
  • Workflow.RunTaskAsync - Safe form of Task.Run or Task.Factory.StartNew
  • Workflow.WhenAllAsync - Safe form of Task.WhenAll
  • Workflow.WhenAnyAsync - Safe form of Task.WhenAny
  • Temporalio.Workflows.Mutex - Safe form of System.Threading.Mutex
  • Temporalio.Workflows.Semaphore - Safe form of System.Threading.Semaphore or System.Threading.SemaphoreSlim

Cloud Operations Client (EXPERIMENTAL)

For making operation-based calls against the cloud, there is now a Temporalio.Client.TemporalCloudOperationsClient
that implements ITemporalCloudOperationsClient and contains a static ConnectAsync method that works similar to the
TemporalClient version. There is a CloudService property on this client that gives raw access to the gRPC service.

This SDK API and the cloud operations API is experimental and may change in incompatible ways in the future.

Resource-based Worker Auto-tuning (EXPERIMENTAL)

Experimental support for worker tuning has been added along with an implementation for auto-tuning based on available
resources. TemporalWorkerOptions now has a Tuner field that can be set with an instance of
Temporalio.Worker.Tuning.IWorkerTuner. This can be a fixed-size based tuner via WorkerTuner.CreateFixedSize or based
on resources via WorkerTuner.CreateResourceBased. Technically the interface can be manually implemented to return
custom ISlotSuppliers, but only fixed-size and resource-based slot suppliers are currently supported, custom slot
suppliers will appear in the future.

This SDK API is experimental and may change in incompatible ways in the future.

Specific Changes

2024-07-01 - 29753e5 - Expose resource based autotuning (#293)
2024-07-01 - 9ce6b8f - Added exception notation to ConnectAsync method (#295)
2024-07-02 - 0d0334f - Minor test fixes (#296)
2024-07-02 - 72f6fb2 - Warn on unfinished workflow handlers (#294)
2024-07-02 - 8349537 - Add Temporalio.Workflows.Mutex (#298)
2024-07-08 - 4a6d4a0 - Experimental cloud operations client (#302)
2024-07-10 - 1fceb0b - Skip slow versioning test and update vuln dep (#301)
2024-07-12 - fa3867e - Support for workflow ID conflict policy (#304)
2024-07-18 - 23af803 - Use GH ARM runner (#308)
2024-07-19 - 32d1931 - Support query for listing schedules (#310)
2024-07-25 - df3b47a - Command reordering in Core (#315)
2024-08-02 - 64c3140 - Change default schedule catchup window to match API (#319)
2024-08-05 - 62da5d6 - Add workflow id conflict policy to signal with start (#322)
2024-08-05 - ac9c891 - Allow updating search attributes from schedule updates (#320)
2024-08-06 - 2ce6c99 - HTTP CONNECT proxy support (#318)
2024-08-06 - 66574bd - Add rule code and edit signal warning (#317)
2024-08-06 - 6695adf - Add Workflow.RunTaskAsync and Workflow.WhenAllAsync (#313)
2024-08-06 - 9ffc963 - Add features repo test to .NET CI (#324)
2024-08-07 - 89c43d1 - Add omes image build (#323)
2024-08-08 - 0b5a857 - Fix NuGet package smoke test (#326)
2024-08-09 - efdb9a0 - Do not warn about leftover handlers on workflow failure (#329)

1.2.0

27 Jun 15:51
b33f682
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

There are not any significant features introduced in this release. But there are a couple of minor features and several dependency updates.

Ensure coroutines complete on workflow complete

Before, if a workflow function returned, nothing else that returned after it would be accepted even if it occurred in the same task (i.e. same event loop run before returning). Now, to better support update handlers and other coroutines, we allow all other coroutines to reach their yielded point upon main workflow method return and we make sure their commands are included before the workflow completion. Care was taken to ensure this is deterministic with workflows in older SDK versions by retaining the previous behavior for those.

Temporalio.Workflow.Semaphore

A lightweight, workflow-safe alternative to SemaphoreSlim is now available as Temporalio.Workflow.Semaphore for use within a workflow.

Workflow update improvements

Can access update info inside update handlers and there is now a special exception thrown from update client calls when an the RPC is cancelled or times out.

Specific Changes

2024-06-06 - 5ed423f - Update core/dependencies and call worker validate (#267)
2024-06-06 - c299cec - Access current update info inside update handler (#268)
2024-06-11 - 3c6c7ac - Workflow completion command reordering (#270)
2024-06-11 - af5e004 - Bump GitHub Actions (#266)
2024-06-12 - bf26249 - Add exceptions to OTel client spans and minor 1.24 server test fixes (#272)
2024-06-13 - d3f3817 - Fix typo in CI workflow (#273)
2024-06-18 - a871164 - Set Rust callbacks to complete tasks asynchronously (#279)
2024-06-18 - c0058a1 - Download cURL in older Linux containers on binary build (#275)
2024-06-21 - 6f54944 - Fix improper casts during clone (#284)
2024-06-21 - 8b430c4 - Add workflow update RPC timeout/canceled exception (#283)
2024-06-26 - 8b7bd2a - Implementation of Temporalio.Workflow.Semaphore (#287)

1.1.2

05 Jun 12:43
7b61747
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

This is mostly a bug fix release.

💥 Fix Workflow.WaitConditionAsync issue introduced in 1.1.1

There is a bug introduced 1.1.1 where WaitConditionAsync could never be properly resolved. This release fixes that bug by (mostly) reverting to behavior in 1.1.0. There is technically a situation where, if your workflow has run in 1.1.1 and encountered this bug, this fix could lead to non-determinism.

💥 Breaking change on experimental workflow update

Updates, still experimental, now require the WaitForStage option to be set when using StartUpdateAsync. Also the UpdateID property in the options is just Id now.

Specific Changes

2024-05-21 - 618e878 - Required wait update stage and polling improvements (#251)
2024-05-22 - 1645178 - Improved docs for RetryPolicy.NonRetryableErrorTypes (#252)
2024-05-28 - ef70705 - Support ApplicationFailureException.NextRetryDelay (#254)
2024-05-29 - 1f6676b - Extended reporting of failed workflow with OTel (#255)
2024-06-04 - 0e24a43 - feat: add workflow client updater for updating workflow client (#258)
2024-06-04 - 43d0f86 - Update generated rpc requests to not omit ConfigureAwait(false) (#260)
2024-06-04 - 83670a0 - Fix wait condition evaluation issue (#259)

1.1.1

10 May 13:34
48fac0c
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

This is just a bug-fix release, no significant highlights of note.

Specific Changes

2024-05-08 - 5cd6f59 - Run wait-condition callbacks in workflow context (#242)
2024-05-08 - f40e78e - Fix issue enumerating services in newer .NET DI library (#241)

1.1.0

07 May 19:43
ee378c1
Compare
Choose a tag to compare

Get from NuGet and read the README

Highlights

Experimental Workflow Failure Type Customization

When a workflow raises an exception that wasn't ApplicationFailureException or bubbled from a Temporal call (e.g. activity failure), it would be a "task failure" which puts the workflow in a suspended state retrying the task until a code fix is deployed. An experimental feature is now available that lets users set which exception types should instead fail the workflow instead of suspending it. Users can now set the per-workflow FailureExceptionTypes on the [Workflow] attribute or set the worker-level WorkflowFailureExceptionTypes option when creating the TemporalWorker. If an exception extends from one of these when raised, it will fail the workflow when raised.

Worker Client Replacement

Workers can now have the client they use replaced without shutting down the worker. The Client property on the TemporalWorker can be set to a different connected client. This is useful for users that need to change options like mTLS client certificate without worker downtime. The worker will not interrupt any polling calls but will start using the new client for subsequent calls.

API Key Client Option

If you use API keys in your Temporal server (i.e. Bearer tokens on Authorization headers), you can now set ApiKey option when connecting a TemporalClient/TemporalConnection or set the ApiKey property on an existing connection to update it.

Floats and Durations in Metrics

Users using MetricMeter directly to create metrics (off of runtime, activity, or workflow) can now create float-based histograms and gauges, and duration-based histograms. Similarly users using ICustomMetricMeter to retrieve metrics can say how they want to retrieve durations (float seconds, int milliseconds, or TimeSpan). A UseSecondsForDuration option was added to telemetry options for users that prefer seconds as float-based durations to OpenTelemetry and Prometheus instead of the default of integer milliseconds.

💥 This has a minor compatibility break. For users that implemented ICustomMetricMeter, calls on that interface can now start passing in double and TimeSpan where it didn't before, but only if users start using those types of metrics.

Counting Workflows

A new CountWorkflowsAsync call has been added to the ITemporalClient that takes the same query as ListWorkflowsAsync but is optimized just to perform counts.

Specific Changes

2024-01-05 - 0e592ee - Fix issue with DI-based static async activities (#172)
2024-01-10 - 53a8a3d - Properly ignore unknown fields when parsing history JSON (#175)
2024-01-12 - 7127437 - Add build id to workflow context (#174)
2024-01-19 - ba4763b - Fix issue with Rust cache using newer node version (#177)
2024-02-01 - 79104b6 - Prefix some errors with rule identifiers (#180)
2024-02-12 - bfe4b3a - Doc/README updates (#188)
2024-02-27 - 66abe70 - Update core (#192)
2024-02-28 - c703da9 - Add type-safe SignalWithStart (#193)
2024-03-01 - e99bcb0 - Eager workflow start (#195)
2024-03-07 - 666ab45 - Fix issue with unconfigured metric meter (#202)
2024-03-07 - ce3f195 - Worker poller and ratio options (#200)
2024-03-08 - 070fba5 - Use Debugger.IsAttached to affect default for debug mode (#201)
2024-03-12 - 3faaf2b - Client API key (#203)
2024-03-21 - 67a52ff - Ability for certain task failure types to fail workflow (#205)
2024-03-21 - d2be959 - Add Client.CountWorkflowsAsync (#206)
2024-03-26 - c6b7aca - Alternative CreateTemporalActivityDefinition (#207)
2024-03-29 - 7d37b9d - Fix README snippet (#213)
2024-04-02 - 070faac - Remove experimental flag from StartDelay (#208)
2024-04-16 - 740dfa2 - Use build ID in the unique DI identifier for workers (#216)
2024-04-19 - 1573d3a - Support duration and float metrics (#223)
2024-04-21 - e11dfd5 - Correct xmldoc spelling error on WorkflowAttribute (#227)
2024-04-22 - 899672c - Make ctor for DefaultPayloadConverter public to expose JsonSerializerOptions (#226)
2024-04-24 - 2bd9ed3 - Readme updates (#230)
2024-04-25 - 9c1c127 - Use macos-12 GHA runners instead of macos-latest (#232)
2024-04-26 - f1b8dde - Support macOS ARM + macOS Intel and update proto generation (#233)
2024-05-06 - e771d5b - Worker client replacement (#236)