WPF async异步处理中实现 UI thread 的绑定同步

先来一个经典的抓取网页,然后Parse转换内容到数组并通过绑定更新到UI的方法:

private async void OnTaskBasedAsyncPattern(object sender, RoutedEventArgs e)
{
 foreach (var req in GetSearchRequests())
 {
  var clientHandler = new HttpClientHandler { Credentials = req.Credentials };
  var client = new HttpClient(clientHandler);
  var response = await client.GetAsync(req.Url, cts.Token);
  string resp = await response.Content.ReadAsStringAsync();
  await Task.Run(() => {
   IEnumerable images = req.Parse(resp);
   foreach (var image in images)
   {
    _searchInfo.List.Add(image);
   }
  }
 }
}

Task.Run 中我们做了两件事情,把抓取到的内容转换成一个枚举数组,然后遍历这个数组把它们都加到与 UI 绑定的 _searchInfo 数组中。
由于 Task.Run 是在后台运行的,直接对 UI 更新会有问题,我们就需要做一些变更:把_searchInfo 的更新放到 UI thread 中。

WPF 中提供了一个简单的方法:

private object _lockList = new object();
public MainWindow()
{
 InitializeComponent();
 this.DataContext = _searchInfo;
 BindingOperations.EnableCollectionSynchronization(_searchInfo.List, _lockList);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值