@@ -110,6 +110,7 @@ static AsyncOperationHandleConfiguredSource()
110110 CancellationTokenRegistration cancellationTokenRegistration ;
111111 IProgress < float > progress ;
112112 bool autoReleaseWhenCanceled ;
113+ bool cancelImmediately ;
113114 bool completed ;
114115
115116 UniTaskCompletionSourceCore < AsyncUnit > core ;
@@ -134,8 +135,9 @@ public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTimin
134135 result . handle = handle ;
135136 result . progress = progress ;
136137 result . cancellationToken = cancellationToken ;
137- result . completed = false ;
138+ result . cancelImmediately = cancelImmediately ;
138139 result . autoReleaseWhenCanceled = autoReleaseWhenCanceled ;
140+ result . completed = false ;
139141
140142 if ( cancelImmediately && cancellationToken . CanBeCanceled )
141143 {
@@ -169,33 +171,41 @@ void HandleCompleted(AsyncOperationHandle _)
169171
170172 if ( completed )
171173 {
172- TryReturn ( ) ;
174+ return ;
173175 }
174- else
176+
177+ completed = true ;
178+ if ( cancellationToken . IsCancellationRequested )
175179 {
176- completed = true ;
177- if ( cancellationToken . IsCancellationRequested )
178- {
179- if ( autoReleaseWhenCanceled && handle . IsValid ( ) )
180- {
181- Addressables . Release ( handle ) ;
182- }
183- core . TrySetCanceled ( cancellationToken ) ;
184- }
185- else if ( handle . Status == AsyncOperationStatus . Failed )
186- {
187- core . TrySetException ( handle . OperationException ) ;
188- }
189- else
180+ if ( autoReleaseWhenCanceled && handle . IsValid ( ) )
190181 {
191- core . TrySetResult ( AsyncUnit . Default ) ;
182+ Addressables . Release ( handle ) ;
192183 }
184+ core . TrySetCanceled ( cancellationToken ) ;
185+ }
186+ else if ( handle . Status == AsyncOperationStatus . Failed )
187+ {
188+ core . TrySetException ( handle . OperationException ) ;
189+ }
190+ else
191+ {
192+ core . TrySetResult ( AsyncUnit . Default ) ;
193193 }
194194 }
195195
196196 public void GetResult ( short token )
197197 {
198- core . GetResult ( token ) ;
198+ try
199+ {
200+ core . GetResult ( token ) ;
201+ }
202+ finally
203+ {
204+ if ( ! ( cancelImmediately && cancellationToken . IsCancellationRequested ) )
205+ {
206+ TryReturn ( ) ;
207+ }
208+ }
199209 }
200210
201211 public UniTaskStatus GetStatus ( short token )
@@ -217,7 +227,6 @@ public bool MoveNext()
217227 {
218228 if ( completed )
219229 {
220- TryReturn ( ) ;
221230 return false ;
222231 }
223232
@@ -304,6 +313,7 @@ static AsyncOperationHandleConfiguredSource()
304313 CancellationTokenRegistration cancellationTokenRegistration ;
305314 IProgress < float > progress ;
306315 bool autoReleaseWhenCanceled ;
316+ bool cancelImmediately ;
307317 bool completed ;
308318
309319 UniTaskCompletionSourceCore < T > core ;
@@ -330,6 +340,7 @@ public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoo
330340 result . completed = false ;
331341 result . progress = progress ;
332342 result . autoReleaseWhenCanceled = autoReleaseWhenCanceled ;
343+ result . cancelImmediately = cancelImmediately ;
333344
334345 if ( cancelImmediately && cancellationToken . CanBeCanceled )
335346 {
@@ -363,33 +374,38 @@ void HandleCompleted(AsyncOperationHandle<T> argHandle)
363374
364375 if ( completed )
365376 {
366- TryReturn ( ) ;
377+ return ;
367378 }
368- else
379+ completed = true ;
380+ if ( cancellationToken . IsCancellationRequested )
369381 {
370- completed = true ;
371- if ( cancellationToken . IsCancellationRequested )
372- {
373- if ( autoReleaseWhenCanceled && handle . IsValid ( ) )
374- {
375- Addressables . Release ( handle ) ;
376- }
377- core . TrySetCanceled ( cancellationToken ) ;
378- }
379- else if ( argHandle . Status == AsyncOperationStatus . Failed )
380- {
381- core . TrySetException ( argHandle . OperationException ) ;
382- }
383- else
382+ if ( autoReleaseWhenCanceled && handle . IsValid ( ) )
384383 {
385- core . TrySetResult ( argHandle . Result ) ;
384+ Addressables . Release ( handle ) ;
386385 }
386+ core . TrySetCanceled ( cancellationToken ) ;
387+ }
388+ else if ( argHandle . Status == AsyncOperationStatus . Failed )
389+ {
390+ core . TrySetException ( argHandle . OperationException ) ;
391+ }
392+ else
393+ {
394+ core . TrySetResult ( argHandle . Result ) ;
387395 }
388396 }
389397
390398 public T GetResult ( short token )
391399 {
392- return core . GetResult ( token ) ;
400+ try
401+ {
402+ return core . GetResult ( token ) ;
403+ }
404+ finally
405+ {
406+ if ( ! ( cancelImmediately && cancellationToken . IsCancellationRequested ) )
407+ TryReturn ( ) ;
408+ }
393409 }
394410
395411 void IUniTaskSource . GetResult ( short token )
@@ -416,7 +432,6 @@ public bool MoveNext()
416432 {
417433 if ( completed )
418434 {
419- TryReturn ( ) ;
420435 return false ;
421436 }
422437
0 commit comments