Cysharp/UniTask · error · TimeoutException
Exceed Timeout:
Error message
Exceed Timeout:
What it means
Thrown by UniTask.Timeout (non-generic) when the timeout delay wins the WhenAny race (winArgIndex == 1) before the wrapped task completes. This is the intended timeout behavior: the task did not finish within the specified TimeSpan, so UniTask cancels the task's CancellationTokenSource (if provided) and throws TimeoutException. The task itself is cancelled as a side effect.
Source
Thrown at src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs:401
(winArgIndex, taskResultIsCanceled, _) = await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);
}
catch
{
delayCancellationTokenSource.Cancel();
delayCancellationTokenSource.Dispose();
throw;
}
// timeout
if (winArgIndex == 1)
{
if (taskCancellationTokenSource != null)
{
taskCancellationTokenSource.Cancel();
taskCancellationTokenSource.Dispose();
}
throw new TimeoutException("Exceed Timeout:" + timeout);
}
else
{
delayCancellationTokenSource.Cancel();
delayCancellationTokenSource.Dispose();
}
if (taskResultIsCanceled)
{
Error.ThrowOperationCanceledException();
}
}
public static async UniTask<T> Timeout<T>(this UniTask<T> task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
{
var delayCancellationTokenSource = new CancellationTokenSource();
var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
View on GitHub (pinned to ceac8d6946)
Solutions
- Increase the timeout value to accommodate expected latency
- Investigate and optimize the wrapped task to complete faster
- Use TimeoutWithoutException if you want to handle the timeout as a boolean rather than an exception
- Catch TimeoutException explicitly and provide a fallback or retry
Example fix
// before
await someNetworkCall.Timeout(TimeSpan.FromSeconds(1));
// after (option 1: longer timeout)
await someNetworkCall.Timeout(TimeSpan.FromSeconds(10));
// after (option 2: suppress)
bool timedOut = await someNetworkCall.TimeoutWithoutException(TimeSpan.FromSeconds(5));
if (timedOut) { /* fallback */ } Defensive patterns
Strategy: try-catch
Try / catch
try
{
await task.Timeout(timeout);
}
catch (TimeoutException ex)
{
// handle timeout: fallback, retry, or log
Debug.LogWarning($"Task timed out: {ex.Message}");
} Prevention
- Set realistic timeout values based on expected worst-case latency
- Use TimeoutWithoutException when you want a boolean result instead of an exception
- Investigate and optimize the wrapped task if timeouts are frequent
- Consider retry logic with exponential backoff for transient slowness
When it happens
Trigger: Calling await task.Timeout(TimeSpan.FromSeconds(5)) where the task takes longer than 5 seconds. Network requests, file I/O, or long-running computations wrapped with .Timeout() that exceed the configured deadline.
Common situations: Slow or unresponsive external systems (servers, databases). Network latency spikes. Deadlocks or contention causing tasks to stall. Configuring an unrealistically short timeout. Tasks that block on locks or never-complete awaits.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- Can not trigger itself in iterating.
- handler
- Delay does not allow minus delayFrameCount. delayFrameCount:
- Delay does not allow minus delayTimeSpan. delayTimeSpan:
- The tasks argument contains no tasks.
AI-assisted analysis of Cysharp/UniTask@ceac8d6946 (2026-08-13).
Data as JSON: /api/errors/561688cb304688c2.
Report an issue: GitHub.