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

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

0 голосов
/ 05 декабря 2018

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

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

    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
        }
     }

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

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

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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Вы можете использовать тот же код в статическом классе в одном методе.Затем вызовите этот метод в файле 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();
    }
}
0 голосов
/ 05 декабря 2018

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

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

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

...