首页 > 解决方案 > 在 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&param=";
    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();
}

标签: c#winformsapiwebrequest

解决方案


不使用 Windows 计时器?我不是在开玩笑。您有多种方法:

  • 了解如何使用异步和异步 Web 界面,这样您就不会长时间阻塞 UI 线程。

或者

  • 使用单独的线程或任务(不需要计时器,您可以有一个任务然后安排另一个任务,即)。

您所做的就是在 UI 线程上运行它,而这实际上是不需要的。尤其是因为您确实发送了同步,所以在执行请求时 UI 会阻塞。这是 UI 知道异步方法多年来解决的一个问题。


推荐阅读