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"          
      ]
    }
  }
}
  • 然后我以10秒的间隔发送遥测数据,如有效负载中的“时间间隔”
  • 然后,我再次使用不同的数据和时间间隔调用“PublishToMethod”,如下所示

    { “输入”:{ “有效载荷”:{ “objectId”:“456” }, “配置”:{ “时间间隔”:5000, “变量”:[ “integerVar.integer” ] } } }

  • 所以定时器可以无缝工作,为这些不同的数据提供服务,并不断发送遥测数据

  • 目前,它只适用于一组数据

    我需要运行计时器调用的方法来多次调用计时器。每个调用将使用不同的数据集独立运行。我怎样才能做到


    看起来通过静态类我可能无法实现,因为我无法处理多个实例

    这里的问题不是异步问题,而是您的
    PayloadCreator
    是一个静态类,并且给定了方法签名,您的计时器也是静态的

    静态项在应用程序域的生命周期中实例化一次-在这种情况下,每次调用
    SetTimer
    ,您都会将以前所有调用使用的计时器的属性更改为
    PublishToMethod


    我无法告诉您如何重新构造此结构,因为我不确定您的要求是什么,但如果计时器需要在不同的“已发布”项目之间有所不同,则无法保持此静态结构。

    请更好地解释您看到的行为以及它的错误。System.Timers.Timer将使用线程池调用已用事件处理程序,这意味着如果上一个调用尚未完成,新调用将开始并行运行。此外,事件处理程序是异步的,并使用wait。这不是“完全异步”是什么意思?您希望它做什么而不做什么?如果这是一个精度问题(例如,您希望每50毫秒运行一次
    sendperictive
    )-
    System.Timers.Timer
    不是正确的choice@LasseV.Karlsen一旦第一次调用“start”,就会根据“timeInterval”定期触发“SendPeriodic”方法。但是,当第二次调用“start”时,它没有遵循“timeInterval”。我不明白发生了什么事。是的,你是对的。我的想法是在不同的时间向“PublishToMethod”发送多个调用,该方法使用不同的数据分别调用“start”方法。我希望它们能并行运行。