我认为这是一个有趣的问题,虽然我不太明白你对每秒执行一次但调用另一个运行五秒钟的函数的解释,但在我看来,你缺少的部分是如何封装一个方法调用。所以我创建了这个示例,它使用了一个计时器和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
或其他一些类型并传入您需要的任何内容。
此外,没有错误检查,您没有提到您正在执行此操作的应用程序类型;例如,您可能想要使用单独的线程。哦,计时器分辨率并不是那么好,所以要小心。
希望这可以帮助。