Глобальные объекты в C # ASP.Net — всегда null при обратном чтении

#c# #asp.net #object #global

#c# #asp.net #объект #глобальный

Вопрос:

В ASP.Net в проекте, использующем C #, у меня есть класс (PlcComms.cs) для взаимодействия с контроллером (ПЛК).
Я хочу, чтобы один объект класса был доступен глобально для каждой веб-страницы в моем проекте.

Я вижу из чтения различных сообщений на форуме, что я должен иметь возможность создавать общедоступный статический объект моего типа класса, то есть PlcComms, в Global.asax.cs или в классе в папке App_Code. Я пробовал оба варианта, и я записываю в объект нормально, но когда я перехожу к чтению из него (из таймера на панели обновления на домашней веб-странице), он всегда считывается как null.

Я не знаю, что делать на этом этапе. кто-нибудь может помочь?

В настоящее время этот класс находится у меня в папке App_Code…

 namespace SpearheadWeb
{
    public static class AppGlobal
    {
        public static SpearheadWeb.PlcComms PlcCommsObject { get; set; }
    }
}
  

это у меня есть на моей веб-странице — кажется, что объект создается нормально…

 namespace SpearheadWeb
{
    public partial class _Default : Page
    {
        private PlcComms CurrentPLC;
        //some other here including ComPorts

        protected void Page_Load(object sender, EventArgs e)
        {           
            if (!Page.IsPostBack)
            {
                try
                {
                    //some settings reading and setup here
                    CurrentPLC = new PlcComms(Global.CommsSettings.CpuType1,Global.CommsSettings.Network1,ComPorts[0], Global.CommsSettings.IPAddress1, Global.CommsSettings.Path1,UpdatePanel.Controls[0].Controls, 1, Global.CommsSettings.MsUpdate1);

                    AppGlobal.PlcCommsObject = CurrentPLC;
  

но в моем таймере (таймер в панели обновления) PLCComms1 здесь всегда равен нулю…

         protected void TimerUpdate_Tick(object sender, EventArgs e)
        {
            PlcComms PLCComms1 = AppGlobal.PlcCommsObject;
  

Комментарии:

1. Возможно ли, что Page_Load не проходит этап чтения / построения? уловка try / catch скрыта, поэтому я не знаю, может быть, это затухает — это объясняет, почему он не устанавливает AppGlobal.PlcCommsObject

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

3. члены класса (переменные, определенные перед кодом в классе) НЕ сохраняются. когда страница отображается, а затем отправляется на сторону клиента? При каждом срабатывании таймера теперь будет выполняться обратная запись, и весь класс page каждый раз воссоздается с нуля. Вам нужно понять концепцию жизненного цикла страницы. Класс создается заново каждый раз для обратной отправки. Веб-разработка не зависит от состояния. Итак, вы не можете использовать класс веб-формы для сохранения значений — они просто этого не делают. Таким образом, статический класс не может сохранять какие-либо значения, кроме как во время рендеринга страницы, а затем он отправляется обратно на сторону клиента. (и класс выходит за пределы области видимости).

4. Майк Фишер: Да, создание CurrentPLC в коде страницы немного странно, но в любом случае я копирую его в AppGlobal. PlcCommsObject вы имеете в виду, что он будет сохраняться за пределами страницы, как считывается таймером.

5. Альберт Д. Каллал : Спасибо. Да, я понимаю, что члены класса на странице не сохраняются. Таймер в updatepanel означает, что таймер не вызывает post обратно, насколько я понимаю, но это не очень помогает. Итак, где я могу создать общедоступный объект класса PlcComms, который будет сохраняться и может быть прочитан несколькими страницами, каждая со своим таймером, позже?