【发布时间】:2020-10-02 20:37:39
【问题描述】:
我想询问一个返回 JSON Rest Api 响应的传感器。我每 40 毫秒调用一次 Api,但它给了我这个错误:
在 System.Threading.Tasks.Task1.get_Result() 中的 System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) 中
我有 interval = 40 的计时器。这就是我如何调用 tha Api 的代码:
private void Timer(object sender, EventArgs e)
{
tmrPollingSick.Stop();
string strJson = "";
HttpClient client = new HttpClient();
string baseUrl = "http://9999.99999.99999.8";
client.BaseAddress = new Uri(baseUrl);
var contentType = new MediaTypeWithQualityHeaderValue("application/json");
client.DefaultRequestHeaders.Accept.Add(contentType);
string strAltezza = string.Empty;
try
{
strJson = "Here I set HEADERS... DATA ect " + Convert.ToChar(34) +
"header" + Convert.ToChar(34) + ": {............"
var contentData = new StringContent(strJson, System.Text.Encoding.UTF8, "application/json");
using (var responseMessage = client.PostAsync("/bla/bla/bla", contentData).Result)
{
if (responseMessage.IsSuccessStatusCode)
{
string strContext = responseMessage.Content.ReadAsStringAsync().Result;
Object dec = JsonConvert.DeserializeObject(strContext); // deserializing Json string (it will deserialize Json string)
JObject obj = JObject.Parse(strContext);
//Process Data In
JObject obj1 = JObject.Parse(obj["bla"].ToString());
JObject obj2 = JObject.Parse(obj1["processDataIn"].ToString());
strAltezza = obj2["1"].ToString();
textBox1.Text = strAltezza;
}
}
}
catch(WebException ex1)
{
MessageBox.Show("web: "+ex1.StackTrace.ToString() + " - " + ex1.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.StackTrace.ToString() + " - " + ex.Message);
}
tmrPollingSick.Start();
}
一切正常,但过了一段时间它给了我这个错误。 我已经读过这个(How to implement real time data for a web page 和this),但我还没有尝试过。 任何建议如何解决这个问题? 有没有其他方法可以在不崩溃的情况下实时获得结果?
【问题讨论】:
-
记录并发布完整的。例外,而不仅仅是它的一部分。您发布的内容仅包含堆栈跟踪中的 2 行。使用
.Result肯定是错误的,但现在无法猜测到底出了什么问题。你达到了服务器的限制?创建一个新的 HttpClient 而不是重用同一个实例会导致套接字耗尽?其他问题? -
顺便说一句,一旦你解析了一个 JSON 字符串,再次解析它的元素是没有意义的。不过,在您的代码中,您同时使用了
JsonConvert和JObject.Parse,因此两次解析相同的响应。 -
Http 不是一个好的选择,它每次都建立一个连接并且加上所有开销......你应该考虑使用 SignalR 或类似的东西
-
@PatrickBeynio 代替 Http 我还能用什么?