2016-11-25 14 views
0

私はいくつかの統一を学び始めています。私はマルチスレッドに関して簡単な質問があります。異なるスレッドから変数を更新しています

私は、データモデルクラスのインスタンスを含むクラスを持っています。このクラスの主な機能は、リモートリソースを非同期的にフェッチし、datamodelクラスを更新することです。次に、更新機能では、データモデルクラスが読み出され、ゲームオブジェクト内のテキストに書き込まれます。

とにかく、クラスの非同期更新が競合状態を引き起こす更新関数と同時に実行できるため、マルチスレッドに関するいくつかの問題が発生する可能性があると心配しています。ミューテックスのクラスへのアクセスをラップする必要がありますか?

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; 
    } 
} 

私はこれに賛成していますか?

thxアドバイスをお願いいたします。

+0

コードを投稿しないと、得られる回答は役に立たない可能性があります。少なくとも、あなたがしていることを示すようにしてください。 – Programmer

+0

@Programmerが私の質問を更新しました... –

+0

ここで、クラスを更新していますか?スレッドコードはどこですか?これは欠けている。もしあなたがこれらの両方を持っていれば、ここに誰かがあなたにこれに答えるのを助けることができます。 – Programmer

答えて

1

私はこれに賛成していますか?

これはあなたの責任です。それはいくつかの問題を引き起こす可能性があります。ではなく、がこれを単独で処理します。一度に1つのスレッドだけがdにアクセスできるようにする責任があります。これにはいくつかの方法がありますが、lockキーワードを使用するとこれに伴います。 d以来

ParsePayload機能に更新され、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; 
     } 
    } 
} 
関連する問題