• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# zapytanie do bazy danych co sekundę

VPS Starter Arubacloud
0 głosów
150 wizyt
pytanie zadane 22 lutego 2023 w C# przez marek.nowak404 Nowicjusz (220 p.)

Pracuje nad programem w MVS do wpisywania wartości do bazy danych MySql. Jest to swego rodzaju licznik który generuje nowy wiersz, wpisuje +1 i wyświetla na bieżąco wartości w aplikacji. 

Kolejnym krokiem w pisaniu kodu jest: odświeżanie/odczytywanie wartości co sekundę lub połączenie z druga bazą danych i nasłuchiwanie zmian np z 0 na 1 też co sekundę.

Jak zrealizować cykliczne odświeżanie co sekundę by jednocześnie nie zakłócić reszty programu ? Próbowałem przykładem z internetu ale to miało tendenjcę do zatrzymywania się. Nieskończona pętla tu też by nie zdała egzaminu bo program ma problem już przy kompilacji.

komentarz 22 lutego 2023 przez Velta Maniak (51,890 p.)

Nieskończona pętla tu też by nie zdała egzaminu bo program ma problem już przy kompilacji.

Możesz podać przykład takiego kodu?

Prosty przykładowy snippet dla aplikacji konsolowej choć nie uruchamia się co dokładnie sekundę bo powstaje opóźnienie, działa bez problemu:

Task loopTask = Task.Run(async () =>
{
	while (true)
	{
		await Task.Delay(1_000);

		string nowString = DateTime.Now.ToString("HH:mm:ss");
		Console.WriteLine($"- {nowString}");
	}	
});

loopTask.Wait();
komentarz 22 lutego 2023 przez marek.nowak404 Nowicjusz (220 p.)
 public Form1()
        {
            InitializeComponent();
            var startTimeSpan = TimeSpan.Zero;
            var periodTimeSpan = TimeSpan.FromSeconds(1);

            var timer = new System.Threading.Timer((e) =>
            {
                MyMethod();
            }, null, startTimeSpan, periodTimeSpan);
        }

To jest ten kod który działa ale do czasu, potem staje, testowane wpisując w metodę odczyt czasu. 

Ten przykład z Task loopTask ma jakieś wady ? powinienem na coś zwrócic uwagę ?

komentarz 22 lutego 2023 przez Velta Maniak (51,890 p.)

Przykład z zegarem w wersji System.Threading powinien działać i to w puli wątków bez blokowania tego głównego. Należy jedynie pamiętać o tym, że operacje związane z kontrolkami należy wykonywać na tym wątku głównym, z użyciem delegatu przez Invoke.

komentarz 22 lutego 2023 przez marek.nowak404 Nowicjusz (220 p.)

Ścina mi program bo pewnie źle tego używam. Dam kawałek kodu czystego bez tego. uciałem też metody bo tam sa tylko operacje na wysyłaniu zapytań sql

public partial class Form1 : Form
    {
        string date;
        string machine_name;

       
        string ConnectString = "poufne rzeczy";
        public Form1()
        {
            InitializeComponent();
 
        }

        private void refresh_button_Click(object sender, EventArgs e)
        {
           
            write_date_and_shift();
            update_label();
            
        }

        private void mach1_button_plus_Click(object sender, EventArgs e)
        {
            machine_name = "mach1";
            label1.Text = machine_name
            write_date_and_shift();
            row_exists();
            update_label();
           
        }

        private void mach2_button_plus_Click(object sender, EventArgs e)
        {
            machine_name = "mach2";
            label1.Text = machine_name
            write_date_and_shift();
            row_exists();
            update_label();
        }
        private void mach3_button_plus_Click(object sender, EventArgs e)
        {
            machine_name = "mach3";
            label1.Text = machine_name
            write_date_and_shift();
            row_exists();
            update_label();
        }

 

komentarz 22 lutego 2023 przez Velta Maniak (51,890 p.)

Operacje na zdalnych serwerach baz danych mogą zajmować na tyle czasu, że ludzka percepcja to wychwyci. Zapewne przycinanie aplikacji wynika z tego, że zadanie do wykonania zajmuje dłużej, niż ułamek sekundy – a domyślnie są wykonywane na tym samym wątku, który utrzymuje interfejs graficzny.

Pomysł z zegarem jest okej, ale jak wspomniałem – wywołania związane z kontrolkami muszą się odbywać w ramach wątku głównego:

System.Threading.Timer someTimer = new((e) =>
{
    SomeMethod();
    Invoke(() => ChangeControlOrSomething());
}, null, 0, 1_000);

Ewentualnie użyć wersji z WinForms, by móc decydować, co wykonać asynchronicznie (w tym przypadku raczej tylko operacja na bazie danych):

System.Windows.Forms.Timer someTimer = new();

someTimer.Interval = 1_000;
someTimer.Tick += new EventTimer(SomeEvent_Tick);

someTimer.Start();
private async void SomeEvent_Tick(object sender, EventArgs e)
{
    await SomeMethodAsync();
    // pozostała logika, ale wykonana już synchronicznie
}

 

komentarz 22 lutego 2023 przez marek.nowak404 Nowicjusz (220 p.)
To zawieszanie miałem na myśli bardziej kompletne odcinkę niż lekkie opóźnienie. Przetestuje te rozwiązania i zobaczymy jaki da efekt
komentarz 23 lutego 2023 przez marek.nowak404 Nowicjusz (220 p.)
Udało mi się zrobić metodę asynchroniczną, która odpowiada za odebranie danych. problem pozostał z timerami. najczęściej jest to błąd że obiekt z timerem nie jest dostepny w języku 7.3 tylko 9.0 i wyższej. Więc jedynie brakuje mi wyzwalacza tej metody :/

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 5 grudnia 2016 w PHP przez gumiss88 Bywalec (2,070 p.)
0 głosów
1 odpowiedź 501 wizyt
0 głosów
1 odpowiedź 270 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...