Right now, I have a function that waits for an event to occur, and returns the event connection parameters. However, if the event does not occur within a specified length of time, the function stops waiting for the event and returns nil.
Here is my function:
function Utility.ConnectEventWithTimeout(event, timeout_length) local bindable_event = Instance.new("BindableEvent") -- Fire BindableEvent with event data when called local connection = event:Connect(function(...) bindable_event:Fire(...) end) -- Cause a timeout if event has not been fired within `timeout_length` delay(timeout_length or 5, function() if not bindable_event then return end bindable_event:Fire() end) -- Yeld until result or timeout local result = bindable_event.Event:Wait() connection:Disconnect() connection = nil bindable_event:Destroy() bindable_event = nil return result end
This works perfectly for all practical purposes. However, as far as I know, there is no effective way to kill the created thread once the event has occurred before the timeout length, so it keeps waiting, possibly for a very long time, effectively wasting resources. My main concern is unnecessary memory use over time, especially with long timeout lengths, or in my main use case, hundreds of NPCs running this function for an event (not pretty).