Member 11697488 Ответов: 2

Вызов функции по таймеру из контроллера в файле global.asax.cs


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

Единственный способ, который я нашел в интернете, - это позвонить ему из Global.asax.cs файл, но он не работает.

Может ли кто-нибудь помочь мне с этим, пожалуйста?
public class WebApiApplication : System.Web.HttpApplication
{
    private static Timer timer;
    protected void Application_Start()
    {
        // AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        //WebApiConfig.Register(GlobalConfiguration.Configuration);

        timer = new System.Timers.Timer(10000);
        var SSSData = new SSSData();

        timer.Elapsed += new ElapsedEventHandler(RedirectToAction("DoPushSend", "Notification", new
        {
            dataSSS = SSSData
        }));
        timer.Interval = 3600000;
        timer.Enabled = true;
    }
}

public static void DoPushSend(SSSData dataSSS)
{
    client.BaseAddress = new Uri("sample.com/3/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    try
    {
        string url = "sample.com/device/";
        WebClient client = new WebClient();
        string content = client.DownloadString(url);
        List<string> expoTokens = JsonConvert.DeserializeObject<list<string>>(content);

        var expoSDKClient = new PushApiClient();
        var pushTicketReq = new PushTicketRequest()
        {
            PushTo = expoTokens,
            PushBadgeCount = 7,
            PushBody = dataSSS.DESCRIPTION + "[<$>]" + dataSSS.LAT + "[<$>]" + dataSSS.LON + "[<$>]" + dataSSS.MAXRADIUS
        };

        int nowTimeTo = DateTime.Compare(DateTime.Now, dataSSS.TIMETO);
        int nowTimeFrom = DateTime.Compare(DateTime.Now, dataSSS.TIMEFROM);

        if (nowTimeFrom >= 0)
        {
            if (nowTimeTo <= 0)
            {
                var result = expoSDKClient.PushSendAsync(pushTicketReq).GetAwaiter().GetResult();
            }
        }
    }
    catch (Exception e)
    {
        SSS_Common.Helpers.ErrorHelper.WriteToLog("Notification : ", e);
    }
}


Что я уже пробовал:

Единственный способ, который я нашел в интернете, - это позвонить ему из Global.asax.cs файл, но он не работает.

2 Ответов

Рейтинг:
2

#realJSOP

Вы должны использовать службу Windows в сочетании с веб-службой (или приложением WebAPI) для чего-то подобного. Служба windows будет просто таймером, который вызовет веб-службу, чтобы сделать это с заданным интервалом.


Рейтинг:
0

Sandeep Mewara

Для этого может быть несколько способов:
1. Таймер
2. Кварцевые
3. Служба Windows

Рекомендации:
Простое планирование задач с использованием глобального asax[^]
Запустить кусок кода один раз в сутки автоматически в ASP MVC, о | форумах ASP.NET [^]
c# - вызов функции после определенного интервала - переполнение стека[^]
Учебник: создание приложения Службы Windows | Microsoft Docs[^]

В вашей настройке, кажется, таймер может быть меньше работы для внедрения - что-то похожее на то, что вы пытаетесь сделать:
1. Использование Application_Start
2. Установите таймер в нем
3. Через таймер, установку, что вы хотите сделать на очередной интервал
Ссылки выше делятся примерами того, как это сделать.


Попробуйте тот, который подходит вам лучше всего. Как правило, что-то вроде каждого часового запуска задания больше подходит для службы Windows.


Member 11697488

Не могли бы вы дать мне фрагмент того, как я могу исправить свой код, потому что я не мог понять, что вы имеете в виду

Sandeep Mewara

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

Держите вещи простыми для начала:
1. Сначала есть что-то базовое, как таймер на основе (используйте 30 - секундный или 1-минутный таймер для некоторого протоколирования или сообщения)
2. как только у вас есть настройка, теперь добавьте свою конкретную базовую логику каждый час

Member 11697488

Я смотрел на них, но не знаю, как реализовать их в своем коде. Я совсем новичок в C#, извините

Sandeep Mewara

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

Member 11697488

Уже попробовать. Мне очень нужна ваша помощь, пожалуйста