質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

7150閲覧

メソッドの引数に条件式を入れたい

SeiMei

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/04/21 21:45

編集2019/04/22 16:14

###解決しました

C#

1/// <summary> 2/// メソッドを指定した一定の間隔で呼び出すタイマー 3/// actionに呼び出したいメソッドを入れる 4/// funcに終了する条件式を入れる 5/// </summary> 6/// <param name="interval">ミリ秒単位で呼び出し間隔を指定</param> 7/// <param name="action">呼び出したいメソッドを入れる</param> 8/// <param name="func">trueになったら終了。初期状態がtrueの場合タイマーは実行されない</param> 9private async void Timer(int interval, Action action, Func<bool> func) 10{ 11 if (!func()) await Task.Delay(interval); 12 while (!func()) 13 { 14 action(); 15 await Task.Delay(interval); 16 } 17}

C#

1Timer(1000, メソッド, () => 条件式);

以下、解決前に書いた質問

前提・実現したいこと

汎用のタイマーを作ろうとしています。
同じ事ができれば他の方法でも問題ないです。

該当のソースコード

C#

1/// <summary> 2/// メソッドを指定した一定の間隔で呼び出すタイマー 3/// </summary> 4private async void Timer(int interval, Action action, ??? ???) 5{ 6 if (???) await Task.Delay(interval); 7 while (???) 8 { 9 action(); 10 await Task.Delay(interval); 11 } 12} 13Timer(1000, 実行するメソッド, タイマーを終了する条件式); 14

試したこと

Google検索を利用して調べた(検索に使ったワードは[C# 式に引数]など)
匿名関数や参照渡しでなんとかしようとしたのですが挫折しました。

補足情報(FW/ツールのバージョンなど)

.NET Framework4.7.1
C#7.3
質問者が中学生

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/04/21 21:54

なぜ「C# タイマー」で検索しないのですか?
papinianus

2019/04/21 22:12

仮引数の型として、単にboolで呼び出す時に式を引数にかくか、Func<bool,T>のようにしてifやwhileで演算するか、どちらかだと思うのですがやりたいことが分かりません。 コンパイルできなくていいので、どうしたいかコードに追記していただきたいです
退会済みユーザー

退会済みユーザー

2019/04/21 23:39

「メソッドを指定した一定の間隔で呼び出す」のが目的なら Timer.Tick イベントのハンドラでそのメソッドを呼び出すのが簡単そうに思えますが? それが不適切な理由があれば教えて下さい。
SeiMei

2019/04/22 15:57

Zuishinさん したのですが思い通りのものがなかったのです papinianusさん 引数にしてしまうとタイマーになりません(初期状態で値が決まってしまうので、何も起こらない or 止まらない) 追記はどのように書けばいいか…… SurferOnWwwさん 精度と使い勝手が悪いように思ったので
guest

回答1

0

ベストアンサー

中身は兎も角として、構文だけなら

C#

1private async void Timer(int interval, Action action, Func<bool> func) 2{ 3 if (func()) await Task.Delay(interval); 4 while (func()) 5 { 6 action(); 7 await Task.Delay(interval); 8 } 9}

投稿2019/04/22 01:57

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/04/22 02:06

if 文不要ではありませんか?
hihijiji

2019/04/22 02:08

そうは思いましたが中身は無視しました。
Zuishin

2019/04/22 02:11

了解しました。
SeiMei

2019/04/22 16:16

ありがとうございます。 それの利用側の書き方が分からなかったのですが、今解決しました。 if文は確かに非同期メソッドなので必要ないですね。 皆さん、私が書くのが拙い文で分かりにくかったと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問