iT邦幫忙

0

[開發經驗分享]如何中斷執行中的 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


尚未有邦友留言

立即登入留言