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.

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)

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.