在做大數據分析時,由於需要從幾千萬甚至幾億筆資料中做運算,應用程式就整個不能動,若中間機器有要做甚麼事,例如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();
}
}