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

c# – 是否可以保证使用任务工厂创建的任务不会在WPF的UI线程中

发布时间:2020-12-16 00:03:39 所属栏目:百科 来源:网络整理
导读:以前我曾经使用后台工作线程进行服务调用而不是阻止UI线程.目前开始使用TPL,但理想情况下任务应该用于CPU密集型任务. 所以想知道使用任务设备进行服务调用是否有任何问题,因为有很多线程会在服务调用完成之前一直处于空闲状态? 另外,对于原始问题,是否可以
以前我曾经使用后台工作线程进行服务调用而不是阻止UI线程.目前开始使用TPL,但理想情况下任务应该用于CPU密集型任务.

所以想知道使用任务设备进行服务调用是否有任何问题,因为有很多线程会在服务调用完成之前一直处于空闲状态?

另外,对于原始问题,是否可以保证在WPF应用程序中与UI线程不同的线程上始终调用创建的任务?

解决方法

任务是计划以某种方式运行的工作的抽象.它不必是CPU密集型的.

通常,在创建Task时,它使用默认调度程序,该调度程序在线程池上调度它(这意味着它不在UI线程上).您可以使用TaskScheduler.FromCurrentSynchronizationContext创建一个将工作发布到UI线程的调度程序.

要使用任务实现类似于BackgroundWorker的行为,您可以使用:

var syncScheduler = TaskScheduler.FromCurrentSynchronizationContext(); // must be called on the UI thread
var task = ... // create the task
task.ContinueWith(t => { /* update the UI here */ },syncScheduler);

关于服务调用,如果您不想浪费线程池线程等待IO,则应使用WCF的APM模式,并结合TaskFactory.FromAsync,如this post中所述.

(编辑:李大同)

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

    推荐文章
      热点阅读