C# 创建IJob失败了

C# 创建IJob失败了,c#,unity3d,C#,Unity3d,我使用的是Unity 2018.3.14。我正在尝试创建一个IJob 以下是我对新工作的称呼: var Job = new IncomingDataTCPJob { worldServer = this, data = sdata }; JobHandle handle = Job.Schedule(); handle.Complete(); sdata是字符串,worldServer是类的实例 这是我声明的结构: public struct IncomingDataTCPJ

我使用的是Unity 2018.3.14。我正在尝试创建一个
IJob

以下是我对新工作的称呼:

var Job = new IncomingDataTCPJob
{
    worldServer = this,
    data = sdata
};

JobHandle handle = Job.Schedule();
handle.Complete();
sdata
是字符串,
worldServer
是类的实例

这是我声明的
结构

public struct IncomingDataTCPJob : IJob
{
    public string data;
    public ClientWorldServer worldServer;

    public void Execute()
    {
        worldServer.OnIncomingData(data);
    }
}
当我尝试运行时,出现以下错误:

InvalidOperationException:IncomingDataTCPJob.data不是值类型。作业结构不能包含任何引用类型


知道我为什么会犯这个错误吗?我对Unity的作业系统真的很陌生。

作业无法接收不可飞航的数据

:

C#作业系统复制数据的方式意味着作业只能访问可blittable数据类型

这样做是为了避免竞争条件,例如并行线程试图访问相同的内存引用

我不知道为什么您的“字符串数据”字段会出现错误,但这很可能是一种误导。Unity的作业系统无法与引用类型元素交互。除了TransformAccessArray(或其他专用类),作业系统只能用于并行处理原始数据无法将自定义“WorldClientServer”类传递给作业结构,因为它不是基本类(因此不可Blitttable)。您需要在将所有内容发送到作业之前将其转换为原始数据,并将其转换回其引用的对象,以便利用作业系统


从作业中获取数据的推荐方法是使用线程安全的。作业系统的限制比标准线程要严格得多,但可以保护您作为开发人员避免造成噩梦级的争用条件错误和内存泄漏。

structs显然不允许实现接口*。为什么不使用struct的instaed类?|*我承认,我自己对此感到困惑。我肯定在内置结构上看到Interfacews。Unity的作业系统@Christopher需要结构。请提供ClientWorldServer类定义?@ErikOverflow您需要整个类吗?这是一个大问题:)它是从单一行为继承的吗@VenelinVasilevInsude作业的
执行
,例如
Debug.Log
?在正常操作期间不能运行,但有一个运行函数可以利用。您可以在主线程上运行作业,以便能够对其进行调试@VenelinVasilev调试为构建中不允许的作业增加了一些灵活性,但它不是无限灵活的。一个很好的经验法则是避免从编译为本机的任何对象调用“普通”托管代码。string也是一种引用类型,这就是为什么他会出现这种错误。根据这个错误,字符串实际上有点奇怪,所以可能有一种方法可以将字符串作为blittable传递。@Menyus