close

上一篇(c#非同步async和await)學習如何利用關鍵字async和await進行非同步執行,

接下來結合ManualResetEvent可以用來暫停和繼續該非同步執行任務

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
 
Task taskTimer;                     // timer任務實體
delegate void showTimeHandler();    // 顯示時間委派函式
ManualResetEvent pauseSignal;       // 控制任務 暫停或繼續
int cnt = 0;                        // 計數器

加入三個按鈕如下

image

啟動非同步任務

// 啟動非同步任務
   private async void button5_Click(object sender, EventArgs e)
   {
       pauseSignal = new ManualResetEvent(true);   
       taskTimer = new Task(timerCallback);
       taskTimer.Start();
       await taskTimer;
   }

任務執行內容

private void timerCallback()
{
    while (true)
    {
        pauseSignal.WaitOne();
        showTime();                           // 顯示目前時間
        cnt++;
        SpinWait.SpinUntil(() => false, 500); // 0.5更新一次
    }
    
}

顯示時間副程式

// 顯示時間副程式
       private void showTime()
       {
           if (this.label1.InvokeRequired)
           {
               showTimeHandler handler = new showTimeHandler(showTime);
               this.Invoke(handler);
           }
           else
           {
               label1.Text = DateTime.Now.ToLongTimeString();
               label2.Text = cnt.ToString();
           }
       }

暫停任務

// 暫停任務
    private void button6_Click(object sender, EventArgs e)
    {
        pauseSignal.Reset();
    }
繼續任務
private void button7_Click(object sender, EventArgs e)
{
    pauseSignal.Set();
}


範例程式:AsyncAwaitApp




參考資料

1. C#非同步async和await

2. C# 如何創建, 暫停, 繼續, 終止一個執行緒(Thread)

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 me1237guy 的頭像
    me1237guy

    天天向上

    me1237guy 發表在 痞客邦 留言(0) 人氣()