c# - 在 winform 中持续使用 API (C#)
问题描述
我制作了一个简单的程序,它必须根据 API 不断检查数据。到目前为止,我所做的是制作一个计时器,然后在计时器事件上执行 GET 程序
private void TimerStatus_Tick(object sender, EventArgs e)
{
//stop timer
TimerStatus.Stop();
//get data
getCommand();
//restart timer
TimerStatus.Start();
}
void getCommand()
{
string url = "https://somewhere/getcommand?token=somekey¶m=";
string param = "0";
WebRequest request = WebRequest.Create(url + param ); ;
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
request.Credentials = CredentialCache.DefaultCredentials;
try
{
WebResponse response = request.GetResponse();
bool connected = false;
if ((((HttpWebResponse)response).StatusDescription) == "OK")
connected = true;
//continue if connected
if (connected)
{
using (Stream dataStream = response.GetResponseStream())
{
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
//check output
Console.WriteLine("Respond from server : " + responseFromServer);
try
{
//parse data, store value
parseThenProcess(responseFromServer);
}
catch
{
//parsing data error
Console.WriteLine("exception error response");
}
}
}
// Close the response.
response.Close();
}
catch
{
Console.WriteLine("Get command failed");
}
}
这段代码对我来说很好。但是,当我尝试在计时器事件中添加更多具有不同 API 的命令时,winforms 感觉有点迟钝。只是我这边的错误与 API 处理无关,还是我需要对如何处理 API 进行一些改进?
private void TimerStatus_Tick(object sender, EventArgs e)
{
//stop timer
TimerStatus.Stop();
//get data
getCommand_A();
getCommand_B();
getParameter_C();
getParameter_D();
//restart timer
TimerStatus.Start();
}
解决方案
不使用 Windows 计时器?我不是在开玩笑。您有多种方法:
- 了解如何使用异步和异步 Web 界面,这样您就不会长时间阻塞 UI 线程。
或者
- 使用单独的线程或任务(不需要计时器,您可以有一个任务然后安排另一个任务,即)。
您所做的就是在 UI 线程上运行它,而这实际上是不需要的。尤其是因为您确实发送了同步,所以在执行请求时 UI 会阻塞。这是 UI 知道异步方法多年来解决的一个问题。
推荐阅读
- android - MVP 架构
- sql - 您如何并排“加入”多个 SQL 数据集(彼此不链接)?
- javascript - 为什么无阻塞节点会减少 I/O 总时间?
- scala - circe 自动推导 - 与进口作斗争
- javascript - 在 url (Javascript) 上添加部分时无法识别 Cookie
- mysql - 是否可以从 MYSQL 中的存储过程中返回多个表
- c# - 等效于 php 中的 C# Encoding.UTF8.GetBytes
- javafx - 重置无限 JavaFX RotateTransition
- ruby-on-rails - Ruby on Rails 控制器实例变量未共享
- functional-programming - 如何使用 [@ocaml.warning "-30"] 隐藏警告 30