在winform(C#)中持续使用API
我已经做了一个简单的程序,它必须基于API不断地检查数据。 到目前为止,我所做的是制作一个计时器,然后在计时器事件上执行GET过程在winform(C#)中持续使用API,c#,winforms,api,webrequest,C#,Winforms,Api,Webrequest,我已经做了一个简单的程序,它必须基于API不断地检查数据。 到目前为止,我所做的是制作一个计时器,然后在计时器事件上执行GET过程 private void TimerStatus_Tick(object sender, EventArgs e) { //stop timer TimerStatus.Stop(); //get data getCommand(); //restart timer TimerStatus.Start(); } vo
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计时器?我不是在开玩笑。您有多种方法:
- 了解如何使用async和async web接口,以避免阻塞UI线程太长
- 使用单独的线程或任务(不需要计时器,您可以有一个任务,然后安排另一个任务,即)
你所做的就是在UI线程上运行它,而这实际上是不需要的。特别是因为您确实发送了同步请求,所以在执行请求时UI会阻塞。这是一个多年来通过UI了解异步方法而解决的问题。是否不使用windows计时器?我不是在开玩笑。您有多种方法:
- 了解如何使用async和async web接口,以避免阻塞UI线程太长
- 使用单独的线程或任务(不需要计时器,您可以有一个任务,然后安排另一个任务,即)
你所做的就是在UI线程上运行它,而这实际上是不需要的。特别是因为您发送了同步请求,所以在执行请求时UI会阻塞。这是一个多年来通过UI了解异步方法解决的问题。谢谢,我不知道请求执行会阻塞UI。您的第一种方法是可以理解的,但是您可以详细说明第二种方法吗?winforms计时器实际上会回调到UI线程中。第二种方法就是使用任务。查找任务api。或者开始一个单独的线程。我的错,我以为你的字面意思是“任务”。我并没有对这个任务做太多的研究,但我认为它只是制作了另一个线程来完成这个任务。如果是这样的话,如何让它在没有计时器的情况下继续执行呢?谢谢,我没有意识到请求执行会阻塞UI。您的第一种方法是可以理解的,但是您可以详细说明第二种方法吗?winforms计时器实际上会回调到UI线程中。第二种方法就是使用任务。查找任务api。或者开始一个单独的线程。我的错,我以为你的字面意思是“任务”。我并没有对这个任务做太多的研究,但我认为它只是制作了另一个线程来完成这个任务。如果是这样,如何使它在没有计时器的情况下连续执行?