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
相关产品推荐
相关产品推荐

