Таймер в Asp.Net Web API

Я хочу использовать один таймер в моем контроллере для выполнения определенной работы.

Ниже приведен код

    public class ProductsController : ApiController
    {

        private readonly System.Timers.Timer _checkTimer = new System.Timers.Timer();
        public readonly int CheckTimerInterval = 10 * 30 * 1000;

        public ProductsController()
        {
            _checkTimer.Elapsed += CheckTimerElapsed;
            _checkTimer.Interval = this.CheckTimerInterval;
            _checkTimer.Enabled = true;
        }

        private void CheckTimerElapsed(object source, ElapsedEventArgs e)
        { 
          //Do the processing
        }
     }

Но проблема в том, что когда я вызываю контроллер, создается новый экземпляр Timer.

Я хочу только один экземпляр таймера. Можете ли вы помочь мне достичь этого?

Я знаю, что использование таймера в контроллере не очень хорошая идея, но у меня нет другого выбора. Я использую этот контроллер для назначения запросов временному пользователю. В таймере мне нужно получить все задания и назначить их действительному пользователю.

1 ответ

Вы можете использовать тот же код в статическом классе под одним методом. Затем вызовите этот метод в файле Global.asax.cs в вашем методе Application_Start()

public static class GlobalValues
{
    private static System.Timers.Timer bomreporttimer;
    public static void StartScrapBom()
    {
        bomreporttimer = new System.Timers.Timer();
        bomreporttimer.Elapsed += Bomreporttimer_Elapsed;
        bomreporttimer.Interval = 1000 * 60 * 15;
        bomreporttimer.Enabled = true;
    }
}

Файл Global.asax.cs

 public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        GlobalValues.GlobalValues.StartScrapBom();
    }
}

Вы не должны делать это в первую очередь, пытайтесь найти проблему, которую вы пытаетесь решить, и попробуйте другие варианты ее решения.

Но в любом случае вам нужен статический экземпляр таймера, так что вы можете просто сделать его статическим, вы также можете использовать IOC для этого. Может быть, лучше разместить его в таком месте, как startup или же global_asax вид кода, чтобы указать, что это глобальный и статический. Кстати, вам также нужно подумать о темах, так что, возможно, сделайте это единым целым.

Опять же, не делайте этого вообще.

Другие вопросы по тегам