You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中IPFS.Net保存文件时异步操作挂起问题

Unity中IPFS文件上传时文件保存无限挂起的问题排查与解决

看起来你遇到了Unity里文件保存+IPFS上传时无限挂起的问题,我帮你分析下可能的原因和解决办法:

我有一段代码,功能是接收一个包含浮点数和数值的Object类,将其以二进制格式写入文件,再通过IPFS.Net上传到网络。目前文件创建正常,但在Unity中执行文件保存操作时会无限挂起,相关代码片段如下:

public static class IPFS_IO { 
    public static void AddObject(Object obs) { 
        string path = Application.persistentDataPath + "/data.bytes"; 
        if (File.Exists(path)) { 
            File...
        }
    }
}

核心原因分析

Unity的主线程负责渲染和用户交互,同步文件IO、同步IPFS上传这类耗时操作直接放在主线程里,很容易导致线程阻塞甚至无限挂起;另外,Object类的序列化异常、文件资源未释放也可能引发这类问题。

针对性解决办法

1. 把耗时操作移到后台线程/用协程异步执行

绝对不要在主线程里跑同步IO和IPFS上传,改用Unity协程+后台线程的组合来处理:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
using Ipfs;

public static class IPFS_IO { 
    // 改用异步协程方法
    public static IEnumerator AddObjectAsync(System.Object obs) { 
        string path = Application.persistentDataPath + "/data.bytes"; 
        
        // 切换到后台线程执行文件写入
        yield return new WaitForBackgroundThread();
        
        try {
            // 用using自动释放文件流,避免资源锁定
            using (var fileStream = new FileStream(path, FileMode.Create)) {
                var formatter = new BinaryFormatter();
                formatter.Serialize(fileStream, obs);
            }
            
            // 调用IPFS异步上传接口
            var ipfsClient = new IpfsClient();
            var uploadResult = await ipfsClient.FileSystem.AddFileAsync(path);
            
            // 切回主线程处理结果(比如打印日志)
            yield return new WaitForEndOfFrame();
            Debug.Log($"文件上传成功,Hash: {uploadResult.Hash}");
        } catch (System.Exception e) {
            // 切回主线程抛出错误
            yield return new WaitForEndOfFrame();
            Debug.LogError($"操作失败: {e.Message}");
        }
    }
}

调用时启动协程即可:

StartCoroutine(IPFS_IO.AddObjectAsync(yourDataObject));

2. 确保序列化类的合法性

如果你的自定义数据类没有标记可序列化特性,或者包含Unity内置组件(比如Transform、MonoBehaviour),BinaryFormatter序列化时会卡住或报错:

  • 给自定义数据类加上[Serializable]特性:
    [System.Serializable]
    public class YourDataClass {
        public float floatValue;
        public int intValue;
        // 只保留纯数值/可序列化字段,不要放Unity组件引用
    }
    
  • 避免序列化Unity组件,手动提取组件的数值(比如transform.position.x)后再序列化。

3. 避免文件资源锁定

如果之前的文件操作没有正确关闭流,会导致文件被锁定,再次写入时阻塞。一定要用using语句包裹文件流,确保自动释放资源(如上面代码所示)。

4. 强制使用IPFS.Net的异步API

IPFS.Net的同步上传方法(比如AddFile)会阻塞主线程,一定要用异步版本(AddFileAsync),配合await或协程处理异步结果。

内容的提问来源于stack exchange,提问作者Samuel Lopes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:27:27