See https://github.com/temporalio/features/issues/481. Like other core-based SDKs, .NET put the workflow complete command on the command list immediately when it occurred from workflow return. And then it truncated anything else after that. So coroutines that completed in the same task but after workflow method return were dropped.
This issue changes that behavior to enure same-task-post-complete coroutine commands are preserved. The approach that is taken now is that, if we are not replaying (or replaying w/ SDK flag set) and there are commands after return, move the return to the end and set an SDK flag. Otherwise do as done today. This not only ensures that workflow completion comes last, but the checking for whether any post-complete commands even exist allow us to not set this flag.
(there is also a somewhat unrelated fix to a flaky user-client-replacement test)
What was changed
See https://github.com/temporalio/features/issues/481. Like other core-based SDKs, .NET put the workflow complete command on the command list immediately when it occurred from workflow return. And then it truncated anything else after that. So coroutines that completed in the same task but after workflow method return were dropped.
This issue changes that behavior to enure same-task-post-complete coroutine commands are preserved. The approach that is taken now is that, if we are not replaying (or replaying w/ SDK flag set) and there are commands after return, move the return to the end and set an SDK flag. Otherwise do as done today. This not only ensures that workflow completion comes last, but the checking for whether any post-complete commands even exist allow us to not set this flag.
(there is also a somewhat unrelated fix to a flaky user-client-replacement test)
Checklist