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; // 計數器
加入三個按鈕如下
啟動非同步任務
// 啟動非同步任務
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
參考資料
全站熱搜
留言列表