.NET 4.x Timer для нестатического метода - C#
Формулировка задачи:
Доброй ночи! Не могу разобраться с таймером. Имеется вот такой код (прошу прощения за размер). Нужно запускать метод Temp через определенные промежутки времени или по расписанию. Но при попытке создания таймера/делегата/события сталкиваюсь с основной проблемой - компилятор требует задать метод как static, но это не вариант. Кто может подсказать, как реализовать это? Все поиски в интернете дают решение только по статическим методам.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Thread.;
using System.Timers;
using System.Net;
using SnmpSharpNet;
using System.Data;
using System.Globalization;
using System.Web;
using MySql.Data.MySqlClient;
namespace zelenka
{
public class GetTemp
{
//private static System.Timers.Timer myTimer;
int dopust_temp = 60;
static void Main(string[] args){
}
private void Temp()
{
OctetString community = new OctetString("public");// SNMP community name
AgentParameters param = new AgentParameters(community);// Установка параметров класса
param.Version = SnmpVersion.Ver1;//установка SNMP версии (1 или 2)
IpAddress agent = new IpAddress("192.168.15.20");
UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 1);// устанавливаем цель
Pdu pdu = new Pdu(PduType.Get); //класс PDU используется для всех запросов
pdu.VbList.Add(".1.3.6.1.4.1.40418.2.3.4.1.0");//IOD температуры
try{ //если не выполнилось, значит не было ответа от агента по запросу
SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu, param); //делаем запрос SNMP
if (result != null){ //если незультат нулевой, то ответа не было или его не получилось разобрать
if (result.Pdu.ErrorStatus != 0) { //если ошибка, возвращаемая агентом, отличается от 0, то смотреть SnmpConstants для определения
string value = "Error in SNMP reply. Error " + result.Pdu.ErrorStatus.ToString() + " index " + result.Pdu.ErrorIndex;
GetTemp tem = new GetTemp ();
tem.insertData (value);
}
else{
int value = Convert.ToInt32 (result.Pdu.VbList [0].Value.ToString(), 10);
if (value>dopust_temp){
GetTemp tem = new GetTemp();
tem.message (value.ToString());
}
else{
GetTemp tem = new GetTemp ();
tem.insertData (value.ToString());
}
}
}
}
catch {//если не было ответа, то соответствующая запись в бд
string value = "No response received from SNMP agent.";
GetTemp tem = new GetTemp ();
tem.insertData (value);
}
}
private void insertData(string val) //Добавление новой записи с помощью параметризованного запроса
{
string conStr = "server=127.0.0.1;user=root;" +
"database=mydb;";
using (MySqlConnection con = new MySqlConnection(conStr)){
DateTime date = DateTime.Today;
string time = DateTime.Now.ToLongTimeString();
try{
string sql = "INSERT INTO temperature (date, time, value)"+"VALUES (@date, @time, @val)";
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.Parameters.AddWithValue("@date", date);//создаем параметры и добавляем их в коллекцию
cmd.Parameters.AddWithValue("@time", time);
cmd.Parameters.AddWithValue("@val", val);
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex){ //обработка ошибки записи в бд
string sql = "INSERT INTO error_log (error)" +
"VALUES (@exception)";
MySqlCommand cmd = new MySqlCommand(sql, con);
cmd.Parameters.AddWithValue("@exception", ex);//создаем параметры и добавляем их в коллекцию
con.Open();
cmd.ExecuteNonQuery();
}
}
}
private void message (string val){
}
}
}Решение задачи: «.NET 4.x Timer для нестатического метода»
textual
Листинг программы
Console.ReadKey(); // ждем пока пользователь не нажмет, чтобы выйти GC.KeepAlive(t); // чтобы сборщик мусора не остановил таймер