首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用线程运行HttpClient.GetAsync(.)它再也回不去了

当我使用线程运行HttpClient.GetAsync(.)它再也回不去了
EN

Stack Overflow用户
提问于 2022-08-17 09:29:25
回答 1查看 126关注 0票数 0

我使用一个C#控制台应用程序来测试Httpclient GetSync()。

当代码在getsync()中运行并关闭时,我需要得到响应结果。线程和任务是在等待冲突,还是线程不是主线程?

我误用的代码。

Program.cs

代码语言:javascript
复制
using System;
using System.Threading;
using AutoProcessWorks;

_AutoProcessWorks autoProcessWorks = new _AutoProcessWorks();
Thread AutoRunThread = new Thread(new ThreadStart(autoProcessWorks.MainRun));
AutoRunThread.Start();

AutoProcessWorks.cs来了

代码语言:javascript
复制
public class _AutoProcessWorks
{
    Api api = new Api();
    SqlTools sqlTools = new SqlTools();
    public bool Switch_Run = true;
    public void MainRun()
    {
        int sleep = 60000;
        Api api = new Api();
        while (Switch_Run)
        {
            var route = "IsNFTContractEnough";
            var res = api.CallPythonApiGet(route);
            Console.WriteLine(res);
            Switch_Run = false;
        }
    }
public class Api
{
    public async Task<string> CallPythonApiGet(string route)
    {
        const string uri = "http://127.0.0.1:5000/";
        using (HttpClient client = new HttpClient())
        {
            var respones_result = "";
            try
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client.Timeout = TimeSpan.FromSeconds(600);
                var response = await client.GetAsync(uri + route);
                respones_result = response.Content.ReadAsStringAsync().Result;
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                return responseBody;
            }
            catch (HttpRequestException e)
            {
                var error = "";
                error += respones_result + "\n\r";
                error += "\nException Caught! Message :" + e.Message;
                return error;
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-17 09:49:32

您到处都缺少await,不应该启动新线程,只需调用await MainRun()即可。

代码语言:javascript
复制
_AutoProcessWorks autoProcessWorks = new _AutoProcessWorks();
await autoProcessWorks.MainRun();
代码语言:javascript
复制
public class _AutoProcessWorks
{
    Api api = new Api();
    SqlTools sqlTools = new SqlTools();
    public bool Switch_Run = true;

    public async Task MainRun()
    {
        int sleep = 60000;
        Api api = new Api();
        while (Switch_Run)
        {
            var route = "IsNFTContractEnough";
            var res = await api.CallPythonApiGet(route);
            Console.WriteLine(res);
            Switch_Run = false;
        }
    }
}
代码语言:javascript
复制
public class Api
{
    static HttpClient client = new HttpClient(); // keep only one of these around

    public async Task<string> CallPythonApiGet(string route)
    {
        const string uri = "http://127.0.0.1:5000/";
        var respones_result = "";
        try
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.Timeout = TimeSpan.FromSeconds(600);
            using var response = await client.GetAsync(uri + route);
            response.EnsureSuccessStatusCode();
            string responseBody = await response.Content.ReadAsStringAsync();
            return responseBody;
        }
        catch (HttpRequestException e)
        {
            var error = respones_result + "\n\r" + "\nException Caught! Message :" + e.Message;
            return error;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73386029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档