ここでは、ある処理ブロックを非同期処理として遅延実行させるサンプルを掲載しています。なお、遅延実行させた非同期処理をキャンセルするサンプルについてもあわせて掲載しています。仕組みについては横に置いておくとして、イメージとしてはスレッドを遅延実行させる間隔に似ているように思います。
スポンサーリンク
非同期処理を遅延実行させる
非同期処理を遅延実行するサンプルになります。サンプル内のコメントも確認ください。
C#
// 遅延実行する非同期処理の作成
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("start:" + DateTime.Now);
// 即、処理復帰する
TaskDelay(1000);
Console.WriteLine("end:" + DateTime.Now);
}
// 非同期処理本体
private async void TaskDelay(int msec)
{
for(int i=0; i<10; i++) {
// 呼び出し元に処理復帰し、以降の処理は非同期で処理する
await Task.Delay(msec);
Console.WriteLine(DateTime.Now + ":i=" + i.ToString());
}
}
遅延実行させた非同期処理をキャンセルする
次は、遅延実行させた非同期処理のキャンセルを行うサンプルコードになります。サンプル内のコメントも参照ください。
C#
// キャンセル用
private CancellationTokenSource _s = null;
// 遅延実行する非同期処理の作成(キャンセルあり)
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("start:" + DateTime.Now);
_s = new CancellationTokenSource();
// 即、処理復帰する
TaskDelayCancel(1000, _s.Token);
Console.WriteLine("end:" + DateTime.Now);
}
// 非同期処理をキャンセルする
private void button3_Click(object sender, EventArgs e)
{
if(_s == null) { return; }
// キャンセル通知
_s.Cancel();
// リソースの解放
_s.Dispose();
_s = null;
}
// 非同期処理(キャンセルあり)
private async void TaskDelayCancel(int msec, CancellationToken token)
{
try
{
for (int i = 0; i < 10; i++)
{
// 非同期で処理待機
// 呼び出し元に処理復帰
await Task.Delay(msec, token);
Console.WriteLine(DateTime.Now + ":i=" + i.ToString());
}
}
catch(Exception ex)
{
// キャンセル通知を受け取ると以下の例外が発生する
// System.Threading.Tasks.TaskCanceledException: タスクが取り消されました。
Console.WriteLine(ex.Message);
}
}