上一篇(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
參考資料
文章標籤
全站熱搜
