Blazor Prozess laufen lassen

  • C# (ASP)
  • (Core) Blazor Server

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von MarvinKleinMusic.

    Blazor Prozess laufen lassen

    Hallo Leute und danke für's reinschauen.

    Kennt jemand eine Möglichkeit einen Hintergrundprozess permanent laufen zu lassen für irgend welche Datenbank Abwicklungen?

    Hab einen erstell mit Hilfe von ChatGPT, aber der läuft erst dann los, wenn die Seite aufgerufen wird, und hört nach paar Stunden auf. Das will ich so nicht. Er soll einfach loslaufen sobald die Seite veröffentlicht ist und permanent laufen.

    Verschoben. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    also die Datenbank usw. ist nicht wirklich das Problem denke ich...

    habe hier so einen kleinen Hintergrund-Prozess:

    C#-Quellcode

    1. ​using jcBase.Static;
    2. using Microsoft.Extensions.Hosting;
    3. using Microsoft.Extensions.Logging;
    4. using System;
    5. using System.Data.SqlClient;
    6. using System.Threading;
    7. using System.Threading.Tasks;
    8. namespace jcBase.Classes;
    9. public class jcBackgroundService : IHostedService, IDisposable
    10. {
    11. private static bool _isRunning = false;
    12. private Timer? _timer;
    13. // ILogger im Konstruktor injizieren
    14. public jcBackgroundService()
    15. {
    16. }
    17. public Task StartAsync(CancellationToken cancellationToken)
    18. {
    19. if (_isRunning)
    20. {
    21. return Task.CompletedTask;
    22. }
    23. _isRunning = true;
    24. _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
    25. return Task.CompletedTask;
    26. }
    27. private void DoWork(object? state)
    28. {
    29. try
    30. {
    31. using (var connection = new SqlConnection(jcStatic.ConnectionString))
    32. {
    33. connection.Open();
    34. var command = new SqlCommand("INSERT INTO [jcSys].[jcTest] VALUES ('Hallo Eugen', CURRENT_TIMESTAMP)", connection);
    35. var reader = command.ExecuteReader();
    36. }
    37. }
    38. catch (Exception e)
    39. {
    40. jcStatic.ShowError(e);
    41. }
    42. }
    43. public Task StopAsync(CancellationToken cancellationToken)
    44. {
    45. _isRunning = false;
    46. _timer?.Change(Timeout.Infinite, 0);
    47. return Task.CompletedTask;
    48. }
    49. public void Dispose()
    50. {
    51. _timer?.Dispose();
    52. }
    53. }


    der einfach mal die ganze zeit jede 5 Sekunden in die Datenbank was schreiben soll unabhängig davon, ob die Seite aufgerufen oder nicht ist.
    Bin auch der Meinung das ich es im Programm.cs richtig gemacht habe... Der IISM wurde auch auf ImmerRun umgestellt. Dennoch läuft es nur paar stunden, und danach muss man die Seite einmal neu aufgerufen haben....
    Das soll ja auch so sein. Der Prozess ist für sich nebenbei am laufen unabhängig davon, ob jemand die Seite aufruft oder nicht. Der IIS Manager soll einfach nur den starten und laufen lassen. Vielleicht geht es garnicht. Weiß ich nicht...

    EugenIS schrieb:

    Hab einen erstell mit Hilfe von ChatGPT,

    Schmeiß ChatGPT weg wenn du sachen nicht ohne Programmieren kannst. Dann versteht man den Code auch und könnte diesen Debuggen. (ist nicht böse gemeint)

    EugenIS schrieb:

    also die Datenbank usw. ist nicht wirklich das Problem denke ich...

    denkst du? versucht zu debuggen? was genau passiert wenn es nicht mehr läuft? warum macht man sowas mit einem webservice? mach dir doch einfach eine konsole oder einen richtigen dienst der so läuft?

    was passiert hier in der funktion:
    catch (Exception e)
    {
    jcStatic.ShowError(e);
    }

    bricht er dort das programm ggf ab statt es nur zu protokollieren?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @xChRoNiKx richtig lesen...

    ​Schmeiß ChatGPT weg wenn du sachen nicht ohne Programmieren kannst. Dann versteht man den Code auch und könnte diesen Debuggen. (ist nicht böse gemeint)

    Danke für den Ratschlag, aber wenn man keine Idee hat, ist es wertvoller Hilfsmittel. Vielleicht nicht perfekt, aber immer hin besser wie nix.

    ​denkst du? versucht zu debuggen? was genau passiert wenn es nicht mehr läuft? warum macht man sowas mit einem webservice?

    ja, denke ich. Denn es wird nur dann gestartet, wenn die Seite einmal aufgerufen wurde, dann läuft es paar Stunden, bis es wieder in "Schlafmodus" versetzt wird.

    ​mach dir doch einfach eine konsole oder einen richtigen dienst der so läuft?

    Das habe ich oben bereits beschrieben, und die anderen haben direkt verstanden was ich will. Aber noch mal für Dich: Ich will keine 10 Dienste und eine Seite haben. Es soll alles in einem als Gesamt-Paket laufen.

    ​was passiert hier in der funktion:catch (Exception e){jcStatic.ShowError(e);}bricht er dort das programm ggf ab statt es nur zu protokollieren?

    Es wird der Fehler protokoliert und das Programm verlässt den Try-Block. Es gibt keinen Fehler.

    PS: Vermutlich kriege ich es nicht hin den IIS-Manager richtig zu konfigurieren, weil das Programm an sich, wenn man es normal startet auch durchläuft. Es wird einfach von IIS-Manager solange nicht gestartet, bis einer die Seite aufruft.

    EugenIS schrieb:

    Danke für den Ratschlag, aber wenn man keine Idee hat, ist es wertvoller Hilfsmittel.


    Es kann eine Hilfe sein ja, aber wirklich damit "programmieren" geht zwar bis zu einem bestimmten niveau, aber wirklich guter Code kommt nicht raus. Mit SpeechToText war es lustig damit Code erstellen zu lassen, aber ich schreibs lieber selbst. Könnte sich sonst auch schnell ein Copy und Paste Fehler einschleichen und man hat nichtmal eine Idee wo, erst recht nicht, wenn man selbst nicht wirklich entsprechende Skills hat.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @DTF was du von hälst sei mal dahin gestellt. Ich wollte jetzt keine Diskussion über ChatGPT anfangen. Wem es hilft, soll es benutzen. Was hilft der Beitrag von Dir bei meinem Problem? Alles nur schlecht quatschen kriege ich bei meiner Frau genug. :thumbsup:
    Naja nu steht aber ja noch im Raum, is IIS überhaupt dafür vorgesehen für das was du haben möchtest?
    Das kann ich dir nicht beantworten. Und mit sowas tut sich ChatGPT auch schwer. Denn der sagt lieber: So und so musst du tun, ungeachtet dessen ob es geht.
    Also ist es genauso möglich das GPT das Problem an der Sache ist.

    Neu

    Blazor bietet dir dafür an, dass du einen BackgroundService startest. Beispiel:

    C#-Quellcode

    1. public class NotificationService : BackgroundService
    2. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    3. {
    4. using var timer = new PeriodicTimer(TimeSpan.FromMilliseconds(200));
    5. while (!stoppingToken.IsCancellationRequested
    6. && await timer.WaitForNextTickAsync(stoppingToken))
    7. {
    8. }
    9. }
    10. }


    In Program CS:

    C#-Quellcode

    1. builder.Services.AddHostedService<NotificationService>();


    Dieser Prozess sollte dann laufen, bis die die Anwendung beendet wird. Der Vorteil bei dieser Variante hier ist, dass der Server sich beim Publishen der App nicht aufhängt, sodass man nicht zweimal publishen muss.

    Jetzt musst du nur noch den IIS entsprechend konfigurieren, sodass dieser nicht nach x Minuten inaktivität den Anwendungspool herunterfährt.

    Ich würde dir aber dennoch eher empfehlen ein zweites Projekt deiner Projektmappe hinzufügen und dieses als Service aufzusetzen, welcher dann unabhängig vom Webservice läuft.

    Viele Grüße
    Marvin