using System.Threading.Tasks; using Godot; public partial class FileDirSelector : FileDialog { private bool _isRequestPending; public override void _Ready() { FileMode = FileModeEnum.OpenDir; Title = "请选择一个文件夹"; Access = AccessEnum.Filesystem; } public async Task SelectFolderAsync() { if (_isRequestPending) { GD.PrintErr("错误:另一个文件对话框请求正在进行中。本次请求被忽略。"); return null; // 直接返回 null 或抛出异常 } _isRequestPending = true; var tcs = new TaskCompletionSource(); void OnDirSelected(string dir) { DirSelected -= OnDirSelected; Canceled -= OnCanceled; tcs.SetResult(dir); _isRequestPending = false; } void OnCanceled() { DirSelected -= OnDirSelected; Canceled -= OnCanceled; tcs.SetResult(null); _isRequestPending = false; } DirSelected += OnDirSelected; Canceled += OnCanceled; PopupCentered(); return await tcs.Task; } }