创建新任务的正确方法,并异步调用Web api c#

srv*_*rv8 2 c# api asynchronous task async-await

你好我已经创建了两个例子,但我不确定这些是否正确.我想创建一个新任务并异步调用web api c#.但是有两个例子.

第一个例子:

        private string APIResponse()
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:55517/");
            // Add an Accept header for JSON format.  
            client.DefaultRequestHeaders.Accept.Add(new 
               MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = client.GetAsync("api/Values").Result;   
            if (response.IsSuccessStatusCode)
            {
                var products = response.Content.ReadAsStringAsync().Result;
                //Thread.Sleep(5000);
                return products.ToString();
            }
            else
            {
                return "ERROR";
            }
        }

        protected async void Apibtn_Click(object sender, EventArgs e)
        {
            Task<string> task = new Task<string>(APIResponse);
            task.Start();

            var ApiResp = await task;
            Do some work here... 
            // ...
            //..
            //.
        }
Run Code Online (Sandbox Code Playgroud)

第二个例子是:

    private async Task<string> APIResponse()
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:55517/");
        // Add an Accept header for JSON format.  
        client.DefaultRequestHeaders.Accept.Add(new 
                MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = await client.GetAsync("api/Values");
        if (response.IsSuccessStatusCode)
        {
            var products = await response.Content.ReadAsStringAsync();
            //Thread.Sleep(5000);
            return products.ToString();
        }
        else
        {
            return "ERROR";
        }
    }

    protected async void Apibtn_Click(object sender, EventArgs e)
    {
        Task<string> task = APIResponse();
        // task.Start();  //You don't need to start the Tasks returned by 
                            async method calls. They're started by default.

        var ApiResp = await task;
        //Do some work here... 
        //...
        //..
        //.
    }
Run Code Online (Sandbox Code Playgroud)

如果以上都不正确你能举个例子吗?谢谢!

SO *_*ood 5

你的第二个例子几乎是正确的,只需做这样的事情:

private async Task<string> APIResponse()
{
    using (HttpClient client = new HttpClient())
    {
        ...
        HttpResponseMessage response = await client.GetAsync("api/Values");
        ...
    }
}

protected async void Apibtn_Click(object sender, EventArgs e)
{
    var apiResp = await APIResponse();
}
Run Code Online (Sandbox Code Playgroud)

不要忘记using关于IDisposable成员的陈述(例如HttpClient)