Need to add a comment here explaining how this works: There's an optional first parameter that is a class instance (raw pointer or shared/weakptr/ref/weakobjptr). If possible, this will be checked for validity before calling the callback Next is the callback, signatures in FAsyncOpState (TODO: Move that to a more visible location), can be a member function After that is any additional params that should be captured (like the ue4 delegates support) (or we remove this capability) Always called on the game thread