使用C#从REST中的REST Api检索数据而不会出现滞后或抖动

我每隔5秒使用C#脚本调用REST。 但问题是应用程序每10秒钟会停滞一次(InvokeRepeating)并等待服务器响应,然后在滞后后给出结果。

如何克服这个问题? 我需要实时访问特定的行,以便检索更改而不会出现任何延迟。

以下代码片段用于读取REST Api

using UnityEngine; using System.Collections; using System.Net; using System.IO; using System.Collections.Generic; using System.Linq; using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; public class Rows { public string description ; public float Efficiency; public bool IsConnected; public string Lastconnection; public float MTBF; public float MTTR; public string Name; public float Speed; public float TemperatureSetPoint; } public class GetData : MonoBehaviour { string url="http:LocalHost/Data/Properties/"; string username="Administrator"; string password="admin"; string rt; void Start () { JToken tok = CallWeb(); } public JToken CallWeb() { { var httpRequest = (HttpWebRequest)WebRequest.Create (url); httpRequest.ContentType = "application/json"; string encoded = System.Convert.ToBase64String (System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username+":"+password)); httpRequest.Headers.Add ("Authorization","Basic "+encoded); httpRequest.Accept = "application/json"; using (HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { rt = reader.ReadToEnd(); JObject data = JObject.Parse(rt); JToken token = (data["rows"][0]); return token; } } } } 

从下面的代码我访问所需的行并使用它。

  using UnityEngine; using System.Collections; using Newtonsoft.Json.Linq; using UnityEngine.UI; public class GetPropertyValues : MonoBehaviour { GetData thing = new GetData (); public GameObject CountText; public GameObject TempText; static string CountValue1; static string CountValue2; static string TempValue1; static string TempValue2; void Start() { JToken token = thing.CallWeb (); foreach (JProperty prop in token) { if (prop.Name == "ScrapCount") { CountValue1 = prop.Value.ToString (); CountText.GetComponent ().text = "Count= "+CountValue1.ToString() ; Debug.Log ("This is the Count value" + prop.Value); InvokeRepeating ("countDisplay", 5, 10); } if (prop.Name == "OvenTemperature") { TempValue1 = prop.Value.ToString (); TempText.GetComponent ().text = TempValue1.ToString () + "'C"; Debug.Log ("This is the Temp value" + prop.Value); InvokeRepeating ("tempDisplay", 5, 10); } } } void countDisplay() { JToken token = thing.CallThingWorx (); foreach (JProperty prop in token) { if (prop.Name == "ScrapCount") { CountValue2 = prop.Value.ToString (); if (CountValue1 == CountValue2) { Debug.Log ("count value is still " + CountValue1); } else if (CountValue1 != CountValue2) { CountText.GetComponent ().text = "Count= " + CountValue2.ToString(); Debug.Log ("count value Changed" + CountValue2); } } } } void tempDisplay() { JToken token = thing.CallWeb (); foreach (JProperty prop in token) { if (prop.Name == "OvenTemperature") { TempValue2 = prop.Value.ToString (); if (TempValue1 == TempValue2) { Debug.Log ("Temp value is still " + TempValue1); } else if (TempValue1 != TempValue2) { TempText.GetComponent ().text = TempValue2.ToString() +"'C"; Debug.Log ("Temp value Changed" + TempValue2); } } } } } 

你似乎在做同步请求。 尝试使用Unity提供的function

https://docs.unity3d.com/Manual/UnityWebRequest.html

 class MyBehaviour: public MonoBehaviour { void Start() { StartCoroutine(GetText()); } IEnumerator GetText() { UnityWebRequest www = UnityWebRequest.Get("http://www.my-server.com"); yield return www.Send(); if(www.isError) { Debug.Log(www.error); } else { // Show results as text Debug.Log(www.downloadHandler.text); // Or retrieve results as binary data byte[] results = www.downloadHandler.data; } } // Edit here StartCoroutine(GetText()); } 

这将在获取数据时保持您的应用运行。 else语句是下载完成后您的操作的位置。