これは興味深い質問だと思っていました。毎秒実行する関数についてのあなたの説明をよく理解していませんが、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
またはその他のタイプを使用して、必要なものを渡すことができます。
また、エラーチェックもなく、このタイプのアプリケーションについては言及していません。たとえば、別のスレッドを使用したいとします。ああ、タイマーの解像度は本当に良くないので注意してください。
これが役に立ちます。
正確に何をしますか? 'CreateFiveX()'を10秒ごとに呼び出しますか?それはどのように "機能をまとめてグループ化"していますか? – svick
OnCreate()の内部if(timer == 10)CreateFiveX(); if(timer == 20)CreateFiveX();したがって、Xは2番目の10,11,12,13,14,20,21,22,23、および24に作成されます。したがって、基本的にCreateFiveX()は5つの関数(すべて同じ関数、わずか5回)を追加しますイベントすなわちタイマ== 21,22,23、および24でそれぞれ発動される。 – ryanb9
あなたの快適さのレベルにもよりますが、このタイプの時間ベースの構成では、通常、Reactive Extensionsを使用します –