My TScriptDelegate becomes unbound after several hours, is there any explanation?

I am having an issue where a multicast delegate stops broadcasting events to subscribed script delegates.
In short, I create a multicast delegate:

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDataEv, const FString&, Message);

And subscribe to it with a TScriptDelegate:

SubscriberDelegate.BindUFunction(this, “OnServerMessage”);
Subscriber->OnDataArrival.Add(SubscriberDelegate);

The event gets fired from a thread, (not the Game Thread). After
several hours, the broadcast stops firing. After debugging I found
that the invocation list of the delegate (OnDataArrival) removes the
reference to my script delegate (SubscriberDelegate above) because it
fails the IsBound check in the following piece of code in the engine:

Engine file: “UE_5.3/Engine/Source/Runtime/Core/Public/UObject/ScriptDelegates.h”

// Invoke each bound function
for( typename FInlineInvocationList::TConstIterator FunctionIt( InvocationListCopy ); FunctionIt; ++FunctionIt )
{
        if( FunctionIt->IsBound() )
        {
                // Invoke this delegate!
                FunctionIt->template ProcessDelegate<UObjectTemplate>(Parameters);
        }
        else if ( FunctionIt->IsCompactable() )
        {
                // Function couldn't be executed, so remove it.  Note that because the original list could have been modified by one of the callbacks, we have to search for the function to remove here.
                RemoveInternal( *FunctionIt );
        }
}

Any ideas why my function becomes unbound? and why it takes several
hours for it to happen? I have attached a more comprehensive set of
code below to better illustrate the issue.

There are also other similar questions without resolution:
https://forums.unrealengine.com/t/multi-cast-delegate-becoming-unbound-after-time-in-editor/413808
https://forums.unrealengine.com/t/dynamic-multicast-delegate-becomes-unbound-after-indeterminate-amount-of-time/127269/9

// AManager.h file ...

UCLASS()
class AManager : public AActor, public IManagerInterface {
    // ...
    UPROPERTY()
    USocketSub* Subscriber;
    TScriptDelegate<> SubscriberDelegate;

    UFUNCTION()
    void OnServerMessage(const FString& Msg);

    // ...
};

// ... End


// AManager.cpp file ...

void AManager::BeginPlay() {
    FString SubAddress = FString::Printf(TEXT("tcp://%s:%d"), *ServerIP, PortSub);
    Subscriber = UZmqSocketSub::CreateZmqSocketSub(Context, SubAddress, *SubscriberHeader, ECallbackExecutionType::None);
    SubscriberDelegate.BindUFunction(this, "OnServerMessage");
    Subscriber->OnDataArrival.Add(SubscriberDelegate);
    Subscriber->Start();
}

void AManager::OnServerMessage(const FString& Msg) {
    FVwMsg* VwMsg = new FVwMsg();
    if (!FVwMsg::Parse(*VwMsg, Msg)) {
        return;
    }
    if (!MessageQueue.Enqueue(VwMsg)) {
        delete VwMsg;
    }
}

// ... End

// USocketSub.h ...

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDataEv, const FString&, Message);
UCLASS(BlueprintType)
class USocketSub : public UObject {
    // ...
    UPROPERTY(BlueprintAssignable)
    FZmqDataEv OnDataArrival;

    UPROPERTY(BlueprintReadWrite)
    ECallbackExecutionType ExecutionType = ECallbackExecutionType::AsyncTask;

    void Thread_Proc();

    // ...
};


// USocket.Sub.cpp

void USocketSub::Thread_Proc() {
    while (Listen && Ready()) {
        // ...
        switch (ExecutionType) {
        case ECallbackExecutionType::None: OnDataArrival.Broadcast(Message); break;
        case ECallbackExecutionType::AsyncTask: {
            AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [this, Message]() {
                FScopeLock Lock(&CriticalSection);
                OnDataArrival.Broadcast(Message);
            });
            break;

        }
        case ECallbackExecutionType::GameThread: {
            AsyncTask(ENamedThreads::GameThread, [this, Message]() {
                OnDataArrival.Broadcast(Message);
            });
        }

        default: break;
        }

        // ..
    }

}

Most likely your object is being deleted (by garbage collection, for some reason) and because of that the delegate becomes invalid.

You must have a reference to the object from somewhere, or the object must be marked with the RF_MarkAsRootSet flag when created.

I double-checked that just in-case. The relevant properties are tagged as UPROPERTY, that includes the UObject above (USocketSub* Subscriber) and the the multicast delegate (OnDataArrival) in it. The Actor (AManager) remains valid even after the delegate disconnects. I thought the delegate (TScriptDelegate<> SubscriberDelegate) might be getting removed, but it is also valid.