Crashes with Interchange runtime Import 5.4 and 5.5

I have a runtime Import of .glb files (glTF) that is working on UE 5.4, but not in UE 5.5.

I have several Issues but it seesm to be the same Problem in diffrent facettes.

In BeginPlay i have a loop that imports .gltf files at runtime via interchange import scene:

It works in packaged build as well in 5_4. The Problem starts if i call the exact same node not at begin play, but instead from a TCP Event from a plugin. in 5.4 the whole engines freezes, and has to be killed.

I updated to UE 5.5 to see if it works there. But there works less then in 5_4 but there is the same crashlog for both cirumstances ( begin play or network start). Here ist the crahslog and screenshot of the trace:

Assertion failed: ++Queue(QueueIndex).RecursionGuard == 1 [File:D:\build++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp] [Line: 677]

UnrealEditor_Core!FNamedTaskThread::ProcessTasksUntilIdle() [D:\build++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:677]
UnrealEditor_InterchangeEngine!UInterchangePipelineBase::ExecuteExportPipeline() [D:\build++UE5\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:870]
UnrealEditor_InterchangeCore!FScopeCycleCounter::~FScopeCycleCounter'::2’::<lambda_1>::operator()() [D:\build++UE5\Sync\Engine\Source\Runtime\Interchange\Core\Private\InterchangeTaskSystem.cpp:210]
UnrealEditor_Core!FGenericPlatformProcess::ConditionalSleep() [D:\build++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformProcess.cpp:412]
UnrealEditor_InterchangeCore!UE::Interchange::FInterchangeTaskSystem::WaitUntilTasksComplete() [D:\build++UE5\Sync\Engine\Source\Runtime\Interchange\Core\Private\InterchangeTaskSystem.cpp:214]
UnrealEditor_InterchangeEngine!UE::Interchange::FImportAsyncHelper::GetCompletionTaskGraphEvent() [D:\build++UE5\Sync\Engine\Source\Runtime\Interchange\Engine\Private\InterchangeManager.cpp:655]
UnrealEditor_InterchangeEngine!UE::Interchange::FImportResult::WaitUntilDone() [D:\build++UE5\Sync\Engine\Source\Runtime\Interchange\Engine\Private\InterchangeManager.cpp:824]

the problem can also be triggered by a simple delay note in front of the loop that starts the interchange Scene Imports.

Any suggestions to prevent this behaviour ? ( even if no delay not is in place)

Hi! Hitting the same issue with C++ code, replacing my FBXImporter with Interchange.

In my instance, I’m calling it from a Menu Item


Assertion failed: ++Queue(QueueIndex).RecursionGuard == 1 [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp] [Line: 677] 



UnrealEditor_Core!FNamedTaskThread::ProcessTasksUntilIdle() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:677]
UnrealEditor_InterchangeEngine!UInterchangePipelineBase::ExecuteExportPipeline() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:870]
UnrealEditor_InterchangeCore!`FScopeCycleCounter::~FScopeCycleCounter'::`2'::<lambda_1>::operator()() [D:\build\++UE5\Sync\Engine\Source\Runtime\Interchange\Core\Private\InterchangeTaskSystem.cpp:210]
UnrealEditor_Core!FGenericPlatformProcess::ConditionalSleep() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformProcess.cpp:412]
UnrealEditor_InterchangeCore!UE::Interchange::FInterchangeTaskSystem::WaitUntilTasksComplete() [D:\build\++UE5\Sync\Engine\Source\Runtime\Interchange\Core\Private\InterchangeTaskSystem.cpp:214]
UnrealEditor_InterchangeEngine!UE::Interchange::FImportAsyncHelper::GetCompletionTaskGraphEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\Interchange\Engine\Private\InterchangeManager.cpp:655]
UnrealEditor_InterchangeEngine!UE::Interchange::FImportResult::WaitUntilDone() [D:\build\++UE5\Sync\Engine\Source\Runtime\Interchange\Engine\Private\InterchangeManager.cpp:824]
UnrealEditor_InterchangeEngine!UInterchangeManager::ImportAsset() [D:\build\++UE5\Sync\Engine\Source\Runtime\Interchange\Engine\Private\InterchangeManager.cpp:1637]
UnrealEditor_DesignLife_Editor!DirectoryImporter::ImportFBXInterchange() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\DirectoryImporter.cpp:59]
UnrealEditor_DesignLife_Editor!DirectoryImporter::ImportFile() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\DirectoryImporter.cpp:307]
UnrealEditor_DesignLife_Editor!UE::Core::Private::Function::TFunctionRefCaller<`ProcessDirectory'::`2'::<lambda_1>,bool,wchar_t const *,bool>::Call() [C:\Program Files\Epic Games\UE_5.5\Engine\Source\Runtime\Core\Public\Templates\Function.h:319]
UnrealEditor_Core!FDirectoryVisitorFuncWrapper::Visit() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformFile.cpp:598]
UnrealEditor_Core!IPlatformFile::FDirectoryVisitor::CallShouldVisitAndVisit() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformFile.cpp:574]
UnrealEditor_Core!`IPlatformFile::IterateDirectoryRecursively'::`2'::FRecurse::Visit() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformFile.cpp:642]
UnrealEditor_Core!IPlatformFile::FDirectoryVisitor::CallShouldVisitAndVisit() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformFile.cpp:574]
UnrealEditor_Core!FWindowsPlatformFile::IterateDirectoryCommon() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Windows\WindowsPlatformFile.cpp:1673]
UnrealEditor_Core!FWindowsPlatformFile::IterateDirectory() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Windows\WindowsPlatformFile.cpp:1617]
UnrealEditor_Core!ParallelForImpl::ParallelForInternal<`IPlatformFile::IterateDirectoryRecursively'::`4'::<lambda_1>,`ParallelForWithTaskContext<TArray<FString,TSizedDefaultAllocator<32> >,TSizedDefaultAllocator<32>,`IPlatformFile::IterateDirectoryRecursivel() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\ParallelFor.h:145]
UnrealEditor_Core!IPlatformFile::IterateDirectoryRecursively() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformFile.cpp:674]
UnrealEditor_Core!IPlatformFile::IterateDirectoryRecursively() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformFile.cpp:713]
UnrealEditor_Core!FFileManagerGeneric::IterateDirectoryRecursively() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\HAL\FileManagerGeneric.cpp:518]
UnrealEditor_DesignLife_Editor!ProcessDirectory() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\DownloadAndImportModels.cpp:110]
UnrealEditor_DesignLife_Editor!UDownloadAndImportModels::DownloadModel() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\DownloadAndImportModels.cpp:169]
UnrealEditor_DesignLife_Editor!UDownloadAndImportModels::ExecuteDownloads() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\DownloadAndImportModels.cpp:81]
UnrealEditor_DesignLife_Editor!UAirtableSubsystem::OnCacheLoaded() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\AirtableSubsystem.cpp:68]
UnrealEditor_DesignLife_Editor!AirtableBulkCache::TickUp() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\AirtableBulkCache.cpp:177]
UnrealEditor_DesignLife_Editor!std::_Func_impl_no_alloc<`AirtableBulkCache::CreateSafeTickUp<FSkus>'::`2'::<lambda_1>,void>::_Do_call() [C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\MSVC\14.40.33521\INCLUDE\functional:909]
UnrealEditor_DesignLife_Editor!``FetchTable<FSkus>'::`2'::<lambda_1>::operator()'::`36'::<lambda_1>::operator()() [C:\Projects\NewCo\DesignLife_Unreal 5.5\Source\DesignLife_Editor\Private\AirtableBulkCache.cpp:151]
UnrealEditor_Core!TGraphTask<FAsyncGraphTask>::ExecuteTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Async\TaskGraphInterfaces.h:634]
UnrealEditor_Core!UE::Tasks::Private::FTaskBase::TryExecuteTask() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Tasks\TaskPrivate.h:504]
UnrealEditor_Core!FNamedTaskThread::ProcessTasksNamedThread() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:779]
UnrealEditor_Core!FNamedTaskThread::ProcessTasksUntilQuit() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:668]
UnrealEditor_Core!UE::Tasks::Private::TryWaitOnNamedThread() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Tasks\TaskPrivate.cpp:338]
UnrealEditor_Core!UE::Tasks::Private::FTaskBase::WaitWithNamedThreadsSupport() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Private\Tasks\TaskPrivate.cpp:238]
UnrealEditor_MassEntityEditor!UMassEntityEditorSubsystem::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\MassEntityEditor\Private\MassEntityEditorSubsystem.cpp:173]
UnrealEditor_UnrealEd!UE::Core::Private::Function::TFunctionRefCaller<`FTickableEditorObject::TickObjects'::`2'::<lambda_1>,void,FTickableObjectBase * __ptr64>::Call() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Templates\Function.h:315]
UnrealEditor_Engine!FTickableObjectBase::SimpleTickObjects() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Tickable.cpp:112]
UnrealEditor_UnrealEd!UEditorEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp:1898]
UnrealEditor_UnrealEd!UUnrealEdEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\UnrealEdEngine.cpp:550]
UnrealEditor!FEngineLoop::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:5869]
UnrealEditor!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:188]
UnrealEditor!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:123]
UnrealEditor!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:277]
UnrealEditor!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:317]
UnrealEditor!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
kernel32
ntdll
void DirectoryImporter::ImportFBXInterchange(const FString& FilePath, const FString& PackagePath)
{
	FString PackageName = GetUniquePackageName(FilePath, PackagePath, TEXT("S_"));
	if (FPackageName::DoesPackageExist(PackageName))
	{
		UE_LOG(LogTemp, Warning, TEXT("The model '%s' already exists as an asset in Unreal."), *FilePath);
		return;
	}
	
	UInterchangeManager& InterchangeManager = UInterchangeManager::GetInterchangeManager();
	UInterchangeSourceData* SourceData = NewObject<UInterchangeSourceData>();
	SourceData->SetFilename(FilePath);

	FImportAssetParameters ImportParameters;
	ImportParameters.bIsAutomated = true;
	ImportParameters.bRunSynchronous = true;

    TArray<UObject*> ImportedAssets;
    bool bImportStarted = InterchangeManager.ImportAsset(
        PackagePath,
        SourceData,
        ImportParameters,
        ImportedAssets
    );

    if (!bImportStarted)
    {
        UE_LOG(LogDirectoryImporter, Warning, TEXT("Failed to start import for '%s'"), *FilePath);
        return;
    }

    if (ImportedAssets.Num() > 0)
    {
        for (UObject* ImportedObject : ImportedAssets)
        {
            if (UStaticMesh* StaticMesh = Cast<UStaticMesh>(ImportedObject))
            {
                // Enable Nanite (if supported) and tweak build settings
                FStaticMeshSourceModel& SourceModel = StaticMesh->GetSourceModel(0);
                FMeshBuildSettings& BuildSettings = SourceModel.BuildSettings;
                BuildSettings.bUseMikkTSpace = true;
                BuildSettings.bComputeWeightedNormals = true;
                BuildSettings.bRecomputeNormals = true;
                BuildSettings.bRecomputeTangents = true;

                // Apply and save changes
                StaticMesh->Build();
                StaticMesh->PostEditChange();
            }
        }

        UE_LOG(LogDirectoryImporter, Log, TEXT("Successfully imported FBX: '%s'"), *FilePath);
    }
    else
    {
        UE_LOG(LogDirectoryImporter, Warning, TEXT("No assets were imported for '%s'"), *FilePath);
    }

}```

I using a plugin that my contain polling at 5.4, so i try to remove that.
I try to get import there again running.

Than i will be build a minimal example for 5.5 sometime later in this summer.

On which Version are you ?

I found a infopage in unreal docs about thread safety. Interchange import needs thread safety.
Thats my advice at the current problem for 5.4. What is wrong in 5.5 i dont know at all so far.

In 5.4 Scrpiting you win thread safety for runtime import as long as you dont use delay nodes right befor the import.
I even suspect you are not allowed to use delay nodes at all during the import so it even doesnt matter if its somewhere else happening. Interchange use a sophisticated and very well designed concept that uses worker threads. Somehow its not immune to other asychnronous events like delays.

Not sure if it would be helpful, but in my case I managed to get past this issue by just deferring the import via a Timer:

FTimerHandle TimerHandle;
GWorld->GetTimerManager().SetTimer(TimerHandle, [=](){
    UObject* Imported = InterchangeManager->
        ImportAsset(TEXT("/path"), SourceData, ImportParams);
}, 0.1f, false);