これは興味深い質問だと思いました.1秒ごとに実行される関数についての説明はよくわかりませんが、5秒間実行される別の関数を呼び出します.欠けている部分はカプセル化する方法ですメソッド呼び出し。そこで、あらかじめ決められたタイマー刻みで呼び出されるタイマーとAction
デリゲートを使用するこのサンプルを作成しました。探しているものであれば、これを設計に推定できるはずです。
class TimedFunction
{
public Action<TimedFunction, object> Method;
public int Seconds = 0;
public TimedFunction() {
}
}
class Program
{
static int _secondsElapsed = 0;
static List<TimedFunction> _funcs = new List<TimedFunction>();
static int _highestElapsed = 0;
static Timer _timer;
static void Main(string[] args) {
var method = new Action<TimedFunction, object>((tf, arg) => Console.WriteLine("{0}: {1}", tf.Seconds, arg));
_funcs.Add(new TimedFunction() { Seconds = 5, Method = method });
_funcs.Add(new TimedFunction() { Seconds = 8, Method = method });
_funcs.Add(new TimedFunction() { Seconds = 13, Method = method });
_funcs.Add(new TimedFunction() { Seconds = 10, Method = method });
_highestElapsed = _funcs.Max(tf => tf.Seconds);
_timer = new Timer(1000);
_timer.Elapsed += new ElapsedEventHandler(t_Elapsed);
_timer.Start();
Console.WriteLine();
Console.WriteLine("----------------------");
Console.WriteLine("Hit any key to exit");
Console.ReadKey(true);
}
static void t_Elapsed(object sender, ElapsedEventArgs e) {
_secondsElapsed++;
foreach (TimedFunction tf in _funcs) {
if (tf.Seconds == _secondsElapsed) {
tf.Method(tf, DateTime.Now.Ticks);
}
}
if (_secondsElapsed > _highestElapsed) {
Console.WriteLine("Finished at {0} seconds", _secondsElapsed - 1);
_timer.Stop();
}
}
}
これは出力です:
----------------------
Hit any key to exit
5: 634722692898378113
8: 634722692928801155
10: 634722692949083183
13: 634722692979496224
Finished at 13 seconds
(これは、コンソールがキープレスを待っている間、タイマーがまだ実行されているため機能します)
Action
すべてのオブジェクトに同じデリゲート インスタンスを使用しましたが、TimedFunction
別のオブジェクトを使用することを妨げるものは何もないことに注意してください。デリゲートが受け取る引数の型を定義する必要はありますが、いつでもobject
または他の型を使用して、必要なものを渡すことができます。
また、エラー チェックはなく、これを実行しているアプリケーションの種類についても言及していません。たとえば、おそらく別のスレッドを使用したいと思うでしょう。ああ、タイマーの解像度はそれほど良くないので注意してください。
お役に立てれば。