第26章 计算限制的异步操作(9)

本文详细介绍了如何在Windows窗体、WPF和Silverlight应用程序中使用同步上下文任务调度器来执行任务,并确保这些任务能够成功更新UI组件。通过实例演示了如何创建并使用同步上下文任务调度器,以及如何处理任务的取消、完成和故障情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

26.5.7 任务调度器

任务基础结构是很灵活的,其中TaskScheduler对象功不可没,TaskScheduler对象负责执行调度的任务,同时向Visual Studio调试器公开任务信息。FCL提供了两个派生自TaskScheduler的类型:线程池任务调度器(thread pool task scheduler)和同步上下文任务调度器(synchronization context task scheduler)。默认情况下,所有应用程序使用的都是线程池任务调度器,这个任务调度器将任务调度给线程池的工作者线程。可以查询TaskScheduler的静态Default属性来获得对默认任务调度器的一个引用。

同步上下文任务调度器通常用于Windows窗体、WPF和Silverlight应用程序。这个任务调度器将所有任务调度给应用程序的GUI线程,使所有任务代码都能成功更新UI组件,比如按钮、菜单项等。同步上下文调度器根本不使用线程池。可以查询TaskScheduler的静态FromCurrentSynchronizationContext方法来获得对一个同步上下文任务调度器的引用。

using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Text = "Synchronization Context Task Scheduler Demo";
            Visible = true;
            Width = 400;
            Height = 100;
        }
        private readonly TaskScheduler m_syncContextTaskScheduler = TaskScheduler.Current;
        private CancellationTokenSource m_cts;
        protected override void OnMouseClick(MouseEventArgs e)
        {
            if (m_cts != null)
            {
                m_cts.Cancel();
                m_cts = null;
            }
            else
            {
                Text = "Operation running";
                m_cts = new CancellationTokenSource();
                var t = new Task<int>(() => ThreadStudy.Program.Sum(m_cts.Token, 10), m_cts.Token);
                t.Start();
                t.ContinueWith(task => Text = "Result: " + task.Result, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, m_syncContextTaskScheduler);
                t.ContinueWith(task => Text = "Operation Canceled", CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled, m_syncContextTaskScheduler);
                t.ContinueWith(task => Text = "Operation faulted", CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, m_syncContextTaskScheduler);
            }
            base.OnMouseClick(e);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值