【问题标题】:unity updating variable from different thread [duplicate]来自不同线程的统一更新变量[重复]
【发布时间】:2017-04-10 05:54:09
【问题描述】:

我开始学习一些统一性,我有一个关于多线程的快速问题。

我有一个包含数据模型类实例的类。该类的主要功能是异步获取远程资源并更新数据模型类。然后在更新函数中读取数据模型类并将其写入游戏对象中的某些文本。

无论如何,我担心它可能会导致一些与多线程相关的问题,因为我对类的异步更新可能与导致竞争条件的更新函数同时运行。我是否必须将对类的访问封装在互斥锁中?

class Data {
    public int Number { get; set; }
    public string Name { get; set; }
}

class Network : MonoBehaviour {
    private Data d;

    public void Start() {
        // setting up handler to async fetch data and call provided callback
        Networking.GetData(s => ParsePayload(s));
    }

    private void ParsePayload(string payload) {
        d = JsonConvert.DeserializeObject<Data>(payload);
    }

    public void Update() {
        var label = GameObject.Find("textObject").GetComponent<Text>();
        label.Text = d.Name;
    }
}

那么我是对的还是统一自己处理这个问题?

感谢任何建议!

【问题讨论】:

  • 如果不发布您的代码,您得到的任何答案都可能对您没有用处。至少,试着展示你在做什么
  • @Programmer 更新了我的问题...
  • 你在哪里更新类,线程代码在哪里。这是缺失的。如果你有这两个,这里有人可以帮你回答这个问题。
  • @programmer 它没有丢失.... ParsePayload()
  • 您只回答了部分缺失的问题。 ParsePayload 被传递给另一个 Thread 进行回调,当结果可用时,Thread 将调用它。现在,调用ParsePayload 的线程代码在哪里?它可以在任何地方访问Data d 吗?

标签: c# .net multithreading unity3d mono


【解决方案1】:

那么我是对的还是统一自己处理这个问题?

你是对的。这可能会导致一些问题,Unity 自己不会处理这个问题。您有责任确保一次只有一个线程可以访问d 变量。有几种方法,但使用 lock 关键字可以完成此操作。

由于dParsePayload 函数中更新并在Update 函数中访问,因此您必须在两个函数中使用lock 关键字。

另一个不相关的问题是GameObject.Find("textObject")。这应该在Start() 函数中完成并保存到一个变量中。不要在每一帧的更新函数中都这样做。

class Network : MonoBehaviour
{
    private Data d;
    Text label;

    private System.Object threadLocker = new System.Object();

    public void Start()
    {
        label = GameObject.Find("textObject").GetComponent<Text>();

        // setting up handler to async fetch data and call provided callback
        Networking.GetData(s => ParsePayload(s));
    }

    private void ParsePayload(string payload)
    {
        lock (threadLocker)
        {
            d = JsonConvert.DeserializeObject<Data>(payload);
        }
    }

    public void Update()
    {
        lock (threadLocker)
        {
            label.text = d.Name;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2016-06-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多