フォームアプリにおける非同期(async/await)時の連続押し禁止、キャンセル、引数と戻り値 など
Q&A
Closed
解決したいこと
いつもお世話になっております。
非同期(async/await)の超初心者です。
いろんなサイトを閲覧していますが、フォームアプリの例があまり無く苦心しております。
動く様になったのですが、先輩方の目から見て「何やってんねん」という部分があればご指導お願い致します。
環境等:
Visual Studio 2015
C#
クラシックなフォームアプリ
動作内容:
- [Delayのテスト]ボタンを押して、重い[DelaySample]関数を起動。
- [キャンセル]ボタンを押して、上記プロセスをキャンセル。
- Escキーを押しても、キャンセル。
発生している問題・エラー
一応動いてます。
該当するソースコード
public partial class Form1 : Form
{
CancellationTokenSource cancelTokenSource; //←ここで宣言
CancellationToken cancellationToken; //←ここで宣言
public Form1()
{
InitializeComponent();
}
private async void buttonDelayTest_Click(object sender, EventArgs e)
{
buttonDelayTest.Enabled = false; //連続押し防止の為、ボタン押下禁止
//キャンセルトークンの設定
cancelTokenSource = new CancellationTokenSource() ;
cancellationToken = cancelTokenSource.Token;
string result = await Task.Run(() => DelaySample(cancellationToken,"パラメータだよ"));
cancelTokenSource.Cancel();
Console.WriteLine("result:" + result);
buttonDelayTest.Enabled = true; //ボタン押下復活
}
private async Task<string> DelaySample(CancellationToken cancellationToken, string param)
{
Console.WriteLine("param⇒" + param);
for (int i = 0; i < 10; i++)
{
if (cancellationToken.IsCancellationRequested)
{
return "キャンセルされました。";
}
Console.WriteLine(i);
await Task.Delay(1000);
}
return "完了";
}
private void buttonCancel_Click(object sender, EventArgs e)
{
//非同期処理をキャンセルする。
cancelTokenSource.Cancel();
}
private void buttonCancel_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
//エスケープキーを押しても、キャンセルする。
switch (e.KeyCode)
{
case Keys.Escape:
Console.WriteLine("Escapeキーが押されました。");
buttonCancel.PerformClick();
break;
}
}
}
自分で試したこと
これでいいのか?の箇所:
・ [Delayのテスト]ボタンの連続押しを防止する為に.Enabledを、false⇔true した。
・ [キャンセル]ボタンで、.Cancel()を効かせる為、
CancellationTokenSource
CancellationToken
をクラス内の共通変数とした。
・ラムダ式これでいいのでしょうか?
・[DelaySample]関数の引数、戻り値の書き方、cancellationTokenの渡し方