• 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ę

Object Storage Arubacloud
0 głosów
158 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 (52,370 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 (52,370 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 (52,370 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ź 176 wizyt
pytanie zadane 5 grudnia 2016 w PHP przez gumiss88 Bywalec (2,070 p.)
0 głosów
1 odpowiedź 510 wizyt
0 głosów
1 odpowiedź 273 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...