加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

wpf – 为什么我的UI在使用System.Threading.Task类时会被阻止?

发布时间:2020-12-20 11:18:45 所属栏目:Python 来源:网络整理
导读:在我的ViewModel中,我有这样的代码: Logs = new ObservableCollectionLog();Logs = Task.Factory.StartNew(() = mainModel.GetLogs()).Result; Log是一个非常简单的类,有几个公共属性. 根据我对Task类的理解,以这种方式调用的mainModel函数GetLogs()应该在
在我的ViewModel中,我有这样的代码:

Logs = new ObservableCollection<Log>();
Logs = Task.Factory.StartNew(() => mainModel.GetLogs()).Result;

Log是一个非常简单的类,有几个公共属性.

根据我对Task类的理解,以这种方式调用的mainModel函数GetLogs()应该在一个单独的线程上运行,当它从数据库中获取记录时,我的UI应该是响应的,但是这不是正在发生的事情,而是在记录正在进行时从数据存储中获取我的UI被阻止.

我希望有人可以解释为什么…… TIA.

编辑:我对Task类的不足之处是不完整的,使用Task类的ContinueWith方法将确保异步执行,如下面在成员回复中所解释的…

解决方法

这是因为您在启动异步操作后立即调用Result. Result属性的getter阻止当前线程的执行,直到任务完成.

更新:

为了异步获取结果,您需要调用ContinueWith并指定在任务完成时将调用的函数:

Task.Factory.StartNew(() => mainModel.GetLogs()).ContinueWith(t => Logs = t.Result);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读