情境
在做大数据分析时,由于需要从几千万甚至几亿笔资料中做运算,应用程式就整个不能动,若中间机器有要做甚么事,例如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