#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, который будет сохраняться и может быть прочитан несколькими страницами, каждая со своим таймером, позже?