RemoveAsyncLoadHandle – Change in Behavior for Ongoing FAsyncPackage::FlushAsyncLoading in UE 5.3
0 reputation · 25 Dec 2021, 23:13 UTC
0 reputation · 25 Dec 2021, 23:13 UTC
32775 reputation · 26 Dec 2021, 02:23 UTC
RemoveAsyncLoadHandle does not stop an already started FAsyncPackage::FlushAsyncLoading cycle. In UE 5.3 the handle primarily unregisters the async load delegate from FStreamableManager. It is a cancellation of notification, not a hard abort of in-flight I/O or package paging.
Confirmed: FStreamableManager::RemoveAsyncLoadHandle removes the FStreamableDelegate associated with the handle from the manager’s pending list. The API documentation describes the handle as a way to cancel pending async loads, with no guarantee of immediate termination of work already started.
Likely explanation for UE 5.3: UE 5.3 refactored task ownership in FAsyncPackage. Cancellation timing relative to the flush loop determines outcome:
Asset I/O may continue on a separate thread even after delegate removal, making observable completion non-deterministic.
Assumption: you are using the FDelegateHandle returned by RequestAsyncLoad and calling RemoveAsyncLoadHandle on the game thread. If you are using a FStreamableHandle from RequestAsyncLoad, the cancellation semantics differ.
One diagnostic that changes the recommendation: is the handle removed before or after FlushAsyncLoading has already pulled the specific package load task from the queue in the same frame? If you can confirm that timing, you can predict whether the delegate will fire with a loaded object or be suppressed entirely.
Use comments to ask for clarification. Post a solution as an answer.
No question comments on this page.