Cysharp/UniTask · error · InvalidOperationException

not yet completed.

Error message

not yet completed.

What it means

Thrown by AutoResetUniTaskCompletionSource.GetResult (non-generic) when the internal status is still Pending. This source type is auto-reset and meant to be awaited; calling GetResult before the source is signaled indicates the awaiter consumed a result that was never produced. The guard prevents returning uninitialized state.

Solutions

  1. Ensure all callback paths call TrySetResult, TrySetException, or TrySetCanceled
  2. Use await rather than manual GetResult calls
  3. Check status before accessing: if (source.UnsafeGetStatus() != UniTaskStatus.Pending) before GetResult

Example fix

// before
var source = AutoResetUniTaskCompletionSource.Create();
// forgot to signal
var result = source.GetResult(0); // throws

// after
var source = AutoResetUniTaskCompletionSource.Create();
source.TrySetResult();
await source.Task; // ok
Defensive patterns

Strategy: validation

Validate before calling

if (source.UnsafeGetStatus() == UniTaskStatus.Pending)
{
    // not ready; signal or await
    return;
}
source.GetResult(token);

Prevention

When it happens

Trigger: Manually calling GetResult on an AutoResetUniTaskCompletionSource before TrySetResult/TrySetException/TrySetCanceled. Awaiting a task whose signaling path was skipped due to a logic error. Using the source after it was auto-reset without re-signaling.

Common situations: Creating an AutoResetUniTaskCompletionSource for a callback-based API but forgetting to call TrySetResult in one or more callback branches. Race conditions where the source is reset before GetResult. Adapters that conditionally signal.

Related errors


AI-assisted analysis of Cysharp/UniTask@ceac8d6946 (2026-08-13). Data as JSON: /api/errors/540ad7981492a651. Report an issue: GitHub.

Appendix: source

Thrown at src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskCompletionSource.cs:655

        [DebuggerHidden]
        public void GetResult(short token)
        {
            MarkHandled();

            var status = (UniTaskStatus)intStatus;
            switch (status)
            {
                case UniTaskStatus.Succeeded:
                    return;
                case UniTaskStatus.Faulted:
                    exception.GetException().Throw();
                    return;
                case UniTaskStatus.Canceled:
                    throw new OperationCanceledException(cancellationToken);
                default:
                case UniTaskStatus.Pending:
                    throw new InvalidOperationException("not yet completed.");
            }
        }

        [DebuggerHidden]
        public UniTaskStatus GetStatus(short token)
        {
            return (UniTaskStatus)intStatus;
        }

        [DebuggerHidden]
        public UniTaskStatus UnsafeGetStatus()
        {
            return (UniTaskStatus)intStatus;
        }

        [DebuggerHidden]
        public void OnCompleted(Action<object> continuation, object state, short token)
        {

View on GitHub (pinned to ceac8d6946)