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

Aruba Cloud - Virtual Private Server VPS
0 głosów
269 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,830 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,830 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,830 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ź 218 wizyt
pytanie zadane 5 grudnia 2016 w PHP przez gumiss88 Bywalec (2,070 p.)
0 głosów
1 odpowiedź 630 wizyt
0 głosów
1 odpowiedź 325 wizyt

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,662 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...