[开发经验分享]如何中断执行中的 Task(任务)

情境

在做大数据分析时,由於需要从几千万甚至几亿笔资料中做运算,应用程序就整个不能动,若中间机器有要做甚麽事,例如Windows要更新或者要变更甚麽设定,就只能痴痴地等它跑完,或者直接关闭应用程序,但是分析状态还是在执行中,但实际上已中断了,所以需要相应的处理,也就是把状态修改为暂停中,必须新增一个暂停功能,所以在这边分享一个简单的,也实作成功的方法。

说明

主要是基於向CancellationTokenSource这个物件抛送Cancel的讯息,然後Task接收到之後,去执行执行绪的中断。

程序码

private CancellationTokenSource cts;
private async void btnAnalysis_Click(object sender, EventArgs e)
{
    cts = new CancellationTokenSource();
    string projectNo = "";
    try
    {
        await Task.Run(() =>
        {
            try
            {
				//注册执行续中断事件
                using (cts.Token.Register(Thread.CurrentThread.Abort))
                {
                    //执行大量运算
                }
            }
            catch (ThreadAbortException)
            {
                //接收到执行绪中断例外状况
				//修改专案状态为暂停中,并跳出讯息
                service.Pause(projectNo);
                MessageBox.Show("已暂停");
            }
        }, cts.Token);
    }
    catch (ThreadAbortException)
    {
        //这边还是会抛送执行绪中断例外,忽略即可
    }
}

//取消按钮
private void btnCancel_Click(object sender, EventArgs e)
{
    if (cts != null && !cts.IsCancellationRequested)
    {
        cts.Cancel();
    }
}

参考来源

https://stackoverflow.com/questions/4359910/how-to-abort-a-task-like-aborting-a-thread-thread-abort-method


<<:  ReactFiber节点的更新入口:beginWork

>>:  Site Cache(网站快取) 、Browser Cache(浏览器快取) 、Server Cache(主机端快取) 3 者有什麽分别?

Hili.link 打开 GA 说亮话

9/13 的伴伴学影音记录,聊聊 缩址服务的 GA 欢迎交流 共笔: https://hackmd....

Day21:人生跑马灯

在我们稍稍脱离初学程序的阶段时,可能会开始使用许多框架工具,抑或是写WebApp时使用Servlet...

Day09:09 - User服务(4) - 前端 - JWT token、修改个人资料

Hola,我是Charlie! 在Day08当中,我们完成了後端的JWT机制还有修改个人资料,在今天...

[Day 26] LIFF InitPlugins

前言 [Day 24] LIFF ScanCode曾提过liff.scanCode()因技术问题,功...

如果你对Microsoft 认证感兴趣

首先感谢这个技术平台让我分享一些专业的东西,今天我会分享一些Microsoft exam certi...