C# 如何在C中处理多个调用的计时器事件#
我有如下方法C# 如何在C中处理多个调用的计时器事件#,c#,asynchronous,timer,C#,Asynchronous,Timer,我有如下方法 public static class PublisherClass { public static async Task PublishToMethod(string methodName, string message) { switch (methodName) { case "start": PayloadCreator.SetTimer(timeInterval); } } } pu
public static class PublisherClass {
public static async Task PublishToMethod(string methodName, string message) {
switch (methodName) {
case "start":
PayloadCreator.SetTimer(timeInterval);
}
}
}
public static class PayloadCreator {
public static void SetTimer(int timeInterval) {
aTimer = new System.Timers.Timer(timeInterval);
aTimer.Elapsed += SendPeriodic;
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
public static async void SendPeriodic(Object source, ElapsedEventArgs e) {
Console.WriteLine("Starting to send periodic Telemetry at {0:HH:mm:ss.fff}", e.SignalTime);
await SendPeriodicTimeSeries(PublisherClass.TimeSeriesTopic, PublisherClass.TelemetrySingle, PublisherClass.Configuration);
await SendPeriodicAlarm(PublisherClass.AlarmTopic, PublisherClass.AlarmSingle);
}
}
每当调用“PublishToMethod”时,计时器就会启动,并不断发送对某些事物的周期性调用。我觉得计时器代码不是完全异步的。如果我调用两次,它的行为就会不同。周期性的时间间隔被打破了
我的场景顺序如下
1.使用“message”参数调用PublishToMethod(string methodName,string message),如下所示methodName'是“开始”
{
"input": {
"payload": {
"objectId": "123"
},
"configuration": {
"timeInterval": 10000,
"variables": [
"numberVar.number",
"stringVar.string",
"boolVar.boolean"
]
}
}
}
看起来通过静态类我可能无法实现,因为我无法处理多个实例 这里的问题不是异步问题,而是您的
PayloadCreator
是一个静态类,并且给定了方法签名,您的计时器也是静态的
静态项在应用程序域的生命周期中实例化一次-在这种情况下,每次调用SetTimer
,您都会将以前所有调用使用的计时器的属性更改为PublishToMethod
我无法告诉您如何重新构造此结构,因为我不确定您的要求是什么,但如果计时器需要在不同的“已发布”项目之间有所不同,则无法保持此静态结构。请更好地解释您看到的行为以及它的错误。System.Timers.Timer将使用线程池调用已用事件处理程序,这意味着如果上一个调用尚未完成,新调用将开始并行运行。此外,事件处理程序是异步的,并使用wait。这不是“完全异步”是什么意思?您希望它做什么而不做什么?如果这是一个精度问题(例如,您希望每50毫秒运行一次
sendperictive
)-System.Timers.Timer
不是正确的choice@LasseV.Karlsen一旦第一次调用“start”,就会根据“timeInterval”定期触发“SendPeriodic”方法。但是,当第二次调用“start”时,它没有遵循“timeInterval”。我不明白发生了什么事。是的,你是对的。我的想法是在不同的时间向“PublishToMethod”发送多个调用,该方法使用不同的数据分别调用“start”方法。我希望它们能并行运行。