111,092
社区成员




Task<string> xmlstring = GetPatientList(pid);
这类代码并不是异步操作,这只是同步返回了一个 Task 对象,而已。这种的异步操作是string xmlstring = await GetPatientList(pid);
是一步到位的“异步”!await Task.Yield();
一定不要“标题党”,不是说别的地方“长得像”就是异步方法,一定要看逻辑!在你调用同步方法之前,要先将当前任务释放,然后等到你的同步代码执行完毕之后才通过当前任务返回值。也就是释放控制在返回值之前。 public static Task<string> GetHTML(string url)
{
var r = new WebClient().DownloadString(url);
return Task.FromResult(r);
}
using System;
using System.Net;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
test();
Console.WriteLine("..................按任意键结束程序");
Console.ReadKey();
}
public static async void test()
{
var x = await GetHTML("https://bbs.csdn.net/topics/398006051");
Console.WriteLine(x);
}
public static async Task<string> GetHTML(string url)
{
await Task.Yield();
return new WebClient().DownloadString(url);
}
}
}
public static class CallWebAPI
{
public static async Task<string> APIPost(string url, string data)
{
string result = string.Empty;
//设置HttpClientHandler的AutomaticDecompression
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
//创建HttpClient(注意传入HttpClientHandler)
using (var http = new HttpClient(handler))
{
//使用FormUrlEncodedContent做HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
//传递单个值
{"", data}//键名必须为空
//传递对象
//{"name","hello"},
//{"age","16"}
});
//await异步等待回应
var response = await http.PostAsync(url, content);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
result = await response.Content.ReadAsStringAsync();
}
return result;
}
static async void APIGet(string url)
{
//创建HttpClient(注意传入HttpClientHandler)
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
using (var http = new HttpClient(handler))
{
//await异步等待回应
var response = await http.GetAsync(url);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}
}