Таймер в 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
вид кода, чтобы указать, что это глобальный и статический. Кстати, вам также нужно подумать о темах, так что, возможно, сделайте это единым целым.
Опять же, не делайте этого вообще.