netcore dienst linux maschine - arraylist

  • C#

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    netcore dienst linux maschine - arraylist

    Hallo,

    ich habe ein Windows Forms Programm mit .net Framework 4.6.1 erstellt, dass liest und analysiert mir die Netzwerkzustände eines Netzwerkes. Es wird alle 3 Sekunden per Timer gesteuert. Läuft seit gut einem Jahr durch wie ein Uhrwerk.

    Nun zum Problem. Das Teil muss auf eine Linux Maschine. Also habe ich alles auf c# umgeschrieben und einen Workerdienst mit dotnetcore erstellt. Wenn ich aber die Arrayliste deklariere und zig andere Dinge, dann werden die immer neu gesetzt. In einem Forms Projekt bleiben sie ja bis zum Beenden der Anwendung.

    Kurzum. Wie und wo deklariere ich arraylisten und andere Variablen bei diesem Workerdienst? ?(
    alte Form-Anwendung

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim APILast As Decimal = 0
    3. Dim walletabfragen As Decimal = 0
    4. Dim trc10txncount As Decimal = 0
    5. Dim lastfnblockid As Decimal = 0
    6. Dim oldfnblockid As Decimal = 0
    7. Dim newblockid As Decimal = 0
    8. Dim newuploadinfo As Boolean = False
    9. Dim contracts As New List(Of contract)
    10. ....


    neue netcore

    C#-Quellcode

    1. public class Worker : BackgroundService
    2. {
    3. private decimal APILast = 0;
    4. private decimal walletabfragen = 0;
    5. private decimal trc10txncount = 0;
    6. private decimal lastfnblockid = 0;
    7. private decimal oldfnblockid = 0;
    8. private decimal newblockid = 0;
    9. private bool newuploadinfo = false;
    10. private DateTime UnixDate = new DateTime(1970, 1, 1, 0, 0, 0);
    11. private List<contract> contracts = new List<contract>();
    12. ...


    Der Teil, der diesen Workerservice aktiviert.

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Threading.Tasks;
    5. using Microsoft.Extensions.DependencyInjection;
    6. using Microsoft.Extensions.Hosting;
    7. namespace TEST_Workerservice
    8. {
    9. public class Program
    10. {
    11. public static void Main(string[] args)
    12. {
    13. CreateHostBuilder(args).Build().Run();
    14. }
    15. public static IHostBuilder CreateHostBuilder(string[] args) =>
    16. Host.CreateDefaultBuilder(args)
    17. .ConfigureServices((hostContext, services) =>
    18. {
    19. services.AddHostedService<Worker>();
    20. });
    21. }
    22. }

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

    Ja, in Winforms hat das ein Timer erledigt und ich habe gelesen, Timer soll man nicht mehr machen bei .netcore.


    C#-Quellcode

    1. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    2. {
    3. while (!stoppingToken.IsCancellationRequested)
    4. {
    5. WebClient client = new WebClient();
    6. string url = FullNode + "/wallet/getnowblock";
    7. string result = client.DownloadString(url);
    8. JObject json = JObject.Parse(result);
    9. decimal lastfnblockid = Convert.ToDecimal(json.SelectToken("block_header.raw_data.number"));
    10. //_logger.LogInformation("Block: " + lastfnblockid);
    11. SearchBlocks(lastfnblockid, lastdbblockid);
    12. await Task.Delay(2000, stoppingToken);
    13. }
    14. }


    letzte Zeile.

    In der Funktion SearchBlocks wird zum Beispiel lastdbblockid auf den letzten Wert gesetzt. (Der quasi ausgelesen wurden ist) Dieser startet aber immer beim deklarierten Anfangswert.

    C#-Quellcode

    1. ​private bool SearchBlocks(decimal lastfnblockid, decimal lastdbblockid)
    2. {
    3. System.Net.WebClient webClient = new System.Net.WebClient();
    4. // Reset all counter
    5. var transaktionen = 0;
    6. bool ishightransaction = false;
    7. _logger.LogInformation("LastFnBlock: " + lastfnblockid + " Lastdbblock:" + lastdbblockid);
    8. // If a new Block is available
    9. if (lastfnblockid > lastdbblockid)
    10. {
    11. for (var blockid = lastdbblockid; blockid <= lastfnblockid; blockid += 50)
    12. {
    13. APILast = lastfnblockid - lastdbblockid;
    14. decimal votetransaction = 0; // Reset votecounter
    15. // Display und calculate Blockdifference
    16. // Download Blocks
    17. decimal destblock = blockid + 50;
    18. string url = FullNode + "/wallet/getblockbylimitnext?startNum=" + blockid + "&endNum=" + destblock;
    19. string result = webClient.DownloadString(url);
    20. JObject json = JObject.Parse(result);
    21. int _count = json.SelectToken("block").Count(); // Blockcounter
    22. // Process all blocks
    23. for (var a = 0; a <= _count - 1; a++)
    24. {
    25. // Get informations about Block
    26. decimal blocknumber = System.Convert.ToDecimal(json.SelectToken("block.[" + a + "].block_header.raw_data.number"));
    27. lastdbblockid = blocknumber;
    28. .....
    29. jetzt kommt nur noch Cryptografischer kram
    Wurden die beiden Parameter im alten Projekt ByRef übergeben?

    Hier ist zwar nun ziemlich viel Code, jedoch bleibt die Initialisierung von lastdbblockid ein Rätsel, außer es geschieht in dem fall, wenn die Funktion SearchBlocks in den else Block rutscht.

    Ich hab nun mal deinen bisherigen Code in eine neue Klasse gepackt (nicht Lauffähig natürlich)
    Die Zeilen die mit this. beginnen habe ich zur veranschaulichung hinzugefügt.

    C#-Quellcode

    1. class Scopes
    2. {
    3. private decimal APILast = 0;
    4. private decimal walletabfragen = 0;
    5. private decimal trc10txncount = 0;
    6. private decimal lastfnblockid = 0;
    7. private decimal lastdbblockid = 0;
    8. private decimal oldfnblockid = 0;
    9. private decimal newblockid = 0;
    10. private bool newuploadinfo = false;
    11. private DateTime UnixDate = new DateTime(1970, 1, 1, 0, 0, 0);
    12. private List<contract> contracts = new List<contract>();
    13. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    14. {
    15. while (!stoppingToken.IsCancellationRequested)
    16. {
    17. this.lastfnblockid = Convert.ToDecimal(json.SelectToken("block_header.raw_data.number"));
    18. decimal lastfnblockid = Convert.ToDecimal(json.SelectToken("block_header.raw_data.number"));
    19. }
    20. }
    21. private bool SearchBlocks(decimal lastfnblockid, decimal lastdbblockid)
    22. {
    23. System.Net.WebClient webClient = new System.Net.WebClient();
    24. // Reset all counter
    25. var transaktionen = 0;
    26. bool ishightransaction = false;
    27. _logger.LogInformation("LastFnBlock: " + lastfnblockid + " Lastdbblock:" + lastdbblockid);
    28. // If a new Block is available
    29. if (lastfnblockid > lastdbblockid)
    30. {
    31. for (var blockid = lastdbblockid; blockid <= lastfnblockid; blockid += 50)
    32. {
    33. APILast = lastfnblockid - lastdbblockid;
    34. decimal votetransaction = 0; // Reset votecounter
    35. // Display und calculate Blockdifference
    36. // Download Blocks
    37. decimal destblock = blockid + 50;
    38. string url = FullNode + "/wallet/getblockbylimitnext?startNum=" + blockid + "&endNum=" + destblock;
    39. string result = webClient.DownloadString(url);
    40. JObject json = JObject.Parse(result);
    41. int _count = json.SelectToken("block").Count(); // Blockcounter
    42. // Process all blocks
    43. for (var a = 0; a <= _count - 1; a++)
    44. {
    45. // Get informations about Block
    46. decimal blocknumber = System.Convert.ToDecimal(json.SelectToken("block.[" + a + "].block_header.raw_data.number"));
    47. lastdbblockid = blocknumber;
    48. this.lastdbblockid = blocknumber;
    49. //Many Processing, Such Cryptography, Wow.
    50. }
    51. }
    52. }
    53. }
    54. }


    Und mir sind folgende Sachen aufgefallen:


    Erkennst du den Unterschied?



    Und Hier?

    Es wird jeweils mit einer lokalen Variablen gearbeitet, die Außerhalb der Funktion absolut keine Bedeutung hat. Daher ist lastdbblockid immer auf 0 wenn du neu in die Methode reinkommst. Daher wollte ich auch gerne mal das VB.NET Equivalent sehen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    Halt, stopp. Noch dürfen die Siegesfanfaren nicht spielen.

    Hast du überhaupt verstanden, warum dieses Problem aufgetreten ist?
    this. sollte in diesem Fall überhaupt nicht gebraucht werden.
    Ich wollte dir damit nur etwas klar machen, es sollte keine Lösung darstellen.

    Denkst du, du bekommst eine Implementation OHNE this. hin?

    VB.NET-Quellcode

    1. Private Function SearchBlocks(ByVal lastfnblockid As Decimal, ByVal lastdbblockid As Decimal) As Boolean
    2. Dim webClient As New System.Net.WebClient
    3. ' Reset all counter
    4. Dim result As String = ""
    5. Dim count = 0
    6. Dim transaktionen = 0
    7. Dim ishightransaction As Boolean = False
    8. ' Display und calculate Blockdifference
    9. ' If a new Block is available
    10. If lastfnblockid - lastdbblockid > 0 Then
    11. Application.DoEvents()
    12. For blockid = CDec(lastdbblockid) To lastfnblockid Step 50
    13. APILast = lastfnblockid - CDec(lastdbblockid)
    14. Dim votetransaction As Decimal = 0 ' Reset votecounter
    15. ' Download Blocks
    16. Dim url = My.Settings.Fullnode "/wallet/getblockbylimitnext?startNum=" & blockid & "&endNum=" & blockid + 50
    17. result = webClient.DownloadString(url)
    18. Dim json As JObject = JObject.Parse(result)
    19. count = json.SelectToken("block").Count ' Blockcounter
    20. ' Process all blocks
    21. For a = 0 To count - 1
    22. ' Get informations about Block
    23. Dim blocknumber As Decimal = CDec(json.SelectToken("block.[" & a & "].block_header.raw_data.number"))
    24. lastblockid = blocknumber




    Wenn ich nochmal eine andere Fragen hier einwerfen dürfte:

    Wie ist der übliche Weg, eine Konfiguration zu speichern und zu laden. My.Settings gibts ja nicht mehr.



    EaranMaleasi schrieb:

    Denkst du, du bekommst eine Implementation OHNE this. hin?


    Nein. Könntest du mir einen Ratschlag dafür geben?

    Beiträge zusammengefügt. ~Thunderbolt

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

    Microsoft geht hier den Weg über die appsettings.json Datei. Diese sollte in deinem Projekt bereits eingebunden sein.
    Lesen sollte funktionieren wie hier beschrieben:
    c-sharpcorner.com/article/read…ngs-json-in-asp-net-core/

    Da jedoch Microsoft gefühlt das ganze DependencyInjection und Konfigurationsystem System mit jedem Release von .NET Core umgestellt hat, kann es sein dass du noch etwas Suchen musst.

    Nun zum Hauptproblem:
    Ich habe mal beides versucht nachzustellen mit den Infos die du mir hier gegeben hast, kann jedoch nicht feststellen, warum es in VB.NET funktioniert, und in C# nicht. Beide zeigen dasselbe Verhalten was die verwendete Variable angeht. Ich hatte ja auf ein ByRef gesetzt, dass sich evtl. irgendwo eingeschlichen hatte. Jedoch anscheinend Fehlanzeige.

    Wenn es wirklich das Problem so löst, und du kein Problem damit hast, dass sich variablennamen und Parameternamen überschneiden, was eigentlich ein NoGo ist. Dann soll es halt so sein. Mehr kann aus den präsentierten Informationen im Moment nicht deuten.