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
- Ensure all callback paths call TrySetResult, TrySetException, or TrySetCanceled
- Use await rather than manual GetResult calls
- 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
- Ensure every callback branch calls TrySetResult/TrySetException/TrySetCanceled
- Prefer await over manual GetResult
- Add a timeout fallback signal so the source always completes
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
- Not yet completed, UniTask only allow to use await.
- Already continuation registered, can not await twice or get
- continuation
- Token version is not matched, can not await twice or get Sta
- Can not trigger itself in iterating.
AI-assisted analysis of Cysharp/UniTask@ceac8d6946 (2026-08-13).
Data as JSON: /api/errors/540ad7981492a651.
Report an issue: GitHub.