1、使用同步上下文和任务调度以及async和await语法糖
private static readonly HttpClient s_httpClient = new HttpClient();
private static readonly WebClient s_WebClientClient = new WebClient();
/// <summary>
/// 测试ConfigureAwait
/// </summary>
public static async void TestConfigureAwait()
{
string text2 = await s_httpClient.GetStringAsync("https://www.baidu.com/").ConfigureAwait(true);//默认,进行上下文交互,下面的代码会交给同步上下文去执行,如果设置ConfigureAwait(false)了,下面的代码不会再同步上下文中处理了。
string text = await s_httpClient.GetStringAsync("https://www.baidu.com/").ConfigureAwait(false); //ConfigureAwait(false)设置成false时,获取的数据不正确,会有bug的 // bug
//downloadBtn.Content = text;
Console.WriteLine($"HttpClient获取的值 :{text}");
//假设,bnttxt是窗体按钮,点击按钮之后获取信息,之后更新按钮显示文本
//使用三种回调方式
string bnttxt = null;
//1、使用回调---使用TaskScheduler获取的同步上下文进行回调
_ = s_httpClient.GetStringAsync("https://www.baidu.com/").ContinueWith(taskstr =>
{
bnttxt = taskstr.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());
//2、使用回调---同步上下文
var currentSynchronizationContext = System.Threading.SynchronizationContext.Current;
_ = s_httpClient.GetStringAsync("https://www.baidu.com/").ContinueWith(taskstr =>
{
currentSynchronizationContext.Post(a => { bnttxt = taskstr.Result; }, null);
}, CancellationToken.None);
//3、使用回调---使用async/await语法糖
var result = await s_httpClient.GetStringAsync("https://www.baidu.com/");
bnttxt = result;
}