Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von ClaraSoft
Thema: STAThreadAttribute beim ScrollViewer
Am im Forum: GUI: Windows-Forms

Ich würde dir eher zu WPF mit MVVM raten, da kommst du gar nicht erst in die Situation GUI Elemente im Code zu erzeugen, da die Ganze GUI mit XAML erzeugt/erstellt wird.

Thema: MySQL mehrere Werte auslesen und als String wiedergeben
Am im Forum: Datentechnologien

Hallo,

Gibt es zur der Exception auch ein Stacktrace? Und wie baust du den die Verbindung zur Datenbank auf, dein Login Objekt scheint zwar eine MySqlConnection zu haben, aber wie sieht der Connection State aus, ist der auf Closed? Ist der string externalip gesetzt?

Außerdem solltest du noch mal dein SQL Befehl anpassen. Statt mit * solltest du die Spalten explizit angeben, diesem Fall wäre das username und group. Ganz davon abgesehen solltest du noch ein Try Catch Block einbauen.

Ich würde dir mal empfehlen dir mal Dapper anzugucken.

Grüße

Thema: Foreach und Switch Case
Am im Forum: Grundlagen von C#

Hallo,

Ich habe die Methode inzwischen etwas umgeschrieben. Die gegenüberliegenden Ampeln sollten synchron miteinander laufen. Die Methode GetCurrentComtrolles() gibt die jeweils gegenüberliegenden Ampeln zurück je nachdem wie der wert von isNorthSouth ist. Dadurch werden jetzt bei jedem Event nur 2 Ampeln geschaltet außerdem habe ich nun einen kurzen Augenblick wo alle Ampeln Rot sind.

Eigentlich ist das Thema abgeschlossen, weil mein eigentliches Problem gelöst ist.


 private void ElapsedEvent(object send, System.Timers.ElapsedEventArgs args)
        {
            try
            {
                var controllers = GetCurrentControllers();
                foreach (var item in controllers.Select((v, i) => new { controller = v, index = i }))
                {
                    switch (item.controller.CurrentPhase)
                    {
                        case TrafficPhase.RedPhase:
                            item.controller.SwitchPhase(TrafficPhase.RedYellowPhase);
                            FireEvent(item.controller, "Activate redsignal and yellowsignal");
                            timer.Interval = 2000;
                            break;
                        case TrafficPhase.RedYellowPhase:
                            item.controller.SwitchPhase(TrafficPhase.GreenPhase);
                            FireEvent(item.controller, "Activate greensignal");
                            timer.Interval = 10000;
                            break;
                        case TrafficPhase.YellowPhase:
                            item.controller.SwitchPhase(TrafficPhase.RedPhase);
                            FireEvent(item.controller, "Activate redsignal");
                            if(item.index == 0) 
                            {
                                isNorthSouth = !isNorthSouth;
                            }
                            timer.Interval = 1000;
                            break;
                        case TrafficPhase.GreenPhase:
                            item.controller.SwitchPhase(TrafficPhase.YellowPhase);
                            FireEvent(item.controller, "Activate yellowsignal");
                            timer.Interval = 2000;
                            break;
                        default:
                            break;
                    }
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception: {ex}");
                throw;
            }
        }

Thema: Speichern und Laden eines 2dArrays
Am im Forum: GUI: WPF und XAML

Hallo

Mir fallen spontan 2 Punkte auf, die etwas komisch sind. Du liest den Filestream in der Load Methode nie. Und zum anderen könnte es bei deiner Save und deiner Load Methode knallen, wenn das Array kleiner ist als die die Schleifen durchläufe -> IndexOutOFRangeException. for schleifen sollten idr so aussehen:


for(int i =0; i < myArray.Length; i++) 
{
 // your code...
}

Daneben würde ich bei Load das Array zurück geben statt, als zu referenz übergeben. Und selbst wenn du lasse so lassen möchtest gib wenigstens ein boolean zurück, aber nicht void.

Grüße

Thema: Foreach und Switch Case
Am im Forum: Grundlagen von C#



Danke Abt, das war der entscheidene Hinweis. Ich hab mein Code um eine try/catch blog erweitert und es kam der erwartete Fehler im log.

Danke euch für eure Hilfe.


Thema: Foreach und Switch Case
Am im Forum: Grundlagen von C#

Hallo,

Ja das ist prinzipel richtig. Die foreach schleife habe ich, weil die Ampelanlage 4 Ampeln steuern soll, diese habe ich aktuell in einem Dictionary drin. Um die Phase zu wechseln muss ich einmal alle Ampeln aufrufen.

Ich habe im groben folgende Klassen:

  • Klasse für ein Lichtsignal mit den Properties für die Farbe, Status und Pin
  • Klasse für eine Ampel mit 3 Lichtsignale für Rot, Gelb und Grün
  • Controller Klasse für eine Ampel
  • Klasse welche die Gesamtanlage steuert und die Controller Klassen aktuell in einem Dictionary hält

Mein geposteter Code ausschnitt kommt aus der letzten Klasse.

@T-Virus:

Ja Laut Konsolen ausgabe scheint er nur einmal durch die Schleife zu gehen.
Log mit aktiven Switch Case:

Key count: 4
Current Key: North
Phase: RedPhase
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9 send message: Activate redsignal and yellowsignal and has phase: RedYellowPhase
Key count: 4
Current Key: North
Phase: RedYellowPhase
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9
Controller: ef0d21a7-c71d-4f72-9a1d-787afbc523f9 send message: Activate greensignal and has phase: GreenPhase

Log ohne Switch Case:

Key count: 4
Current Key: North
Phase: RedPhase
Controller: 6d48cfb3-32e6-4e91-84a8-9e0419201c01
Current Key: East
Phase: RedPhase
Controller: 59b02032-bcca-44d2-990f-07b1dfd99476
Current Key: South
Phase: RedPhase
Controller: b7736796-010f-437d-9ebf-482e73622941
Current Key: West
Phase: RedPhase
Controller: 83581af1-15b4-4e2f-b81c-d00b9208ce46
Key count: 4
Current Key: North

Das läuft Übrigens auf dem Raspberry.

Thema: Foreach und Switch Case
Am im Forum: Grundlagen von C#

Hallo

Ich bin gerade dabei eine Ampelsteuerung für mein Raspberry PI zu programmieren. Jetz bin ich auf ein Problem gestoßen, das ich irgendwie nicht verstehe. Von meinen Timer wird folgendes aufgerufen:


private void ElapsedEvent(object send, System.Timers.ElapsedEventArgs args)
        {
            var keys = currentPhase.Keys;
            Console.WriteLine($"Key count: {keys.Count}");
            foreach (var key in keys)
            {
                Console.WriteLine($"Current Key: {key}");
                var phase = currentPhase[key];
                var controller = trafficLightControllers[key];
                Console.WriteLine($"Phase: {phase}");
                Console.WriteLine($"Controller: {controller.ControllerGuid}");
                switch (phase)
                {
                    case TrafficPhase.RedPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.RedYellowPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate redsignal and yellowsignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 2000;
                        break;
                    case TrafficPhase.RedYellowPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.GreenPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate greensignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 10000;
                        break;
                    case TrafficPhase.YellowPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.RedPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate redsignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 5000;
                        break;
                    case TrafficPhase.GreenPhase:
                        currentPhase[key] = controller.SwitchPhase(TrafficPhase.YellowPhase);
                        MachineStateEventHandler?.Invoke(this, new MachineStateEventArgs("Activate yellowsignal", currentPhase[key], controller.ControllerGuid));
                        timer.Interval = 2000;
                        break;
                    default:
                        Console.WriteLine($"Undefined: {key} or {phase}");
                        break;
                }
            }
        }

Das Problem ist jetzt das der Switch Case dafür sorgt das die Foreach Schleife nicht richtig durchlaufen wird. Es wird immer nur das erste Element durchlaufen.
Der Sowohl currentPhase als auch trafficlightControllers sind Dictionarys mit dem selben Key Typ.
Nehme ich den Switch case raus, funktioniert meine Foreachschleife Problemlos. Im www konnte dazu nix finden. Ich wollte einfach wissen ob das verhalten richtig mit dem Switch Case und der Foreach Loop richtig ist.

Thema: Array in Methode auslagern
Am im Forum: Grundlagen von C#

Ist das nur zur Übung gedacht oder soll das Irgendwo eingesetzt werden?
Fals letzteres zutrifft lass es bleiben und setze implementiere z.B. RSA oder AES oder etwas vergleichbares, dafür gibt es fertige Libarys.

Zu deinem Code:
Versuche weniger globale Variablen zu nutzen.
Sowohl die Crypt als auch die Decrypt Methode sollten statt void etwas zurück geben und einen Übergabe Parameter haben.

Hier mal ein Beispiel wie so eine Methode aussehen könnte:


public int Calculate(int x, int y)
{
     return x * y;
}
Die Methode erwartet 2 ints und gibt das Ergebnis zurück.

Thema: Vier gewinnt auswertung
Am im Forum: Code-Reviews

Zitat von chilic
Zum Beispiel könntest du eine Zeile (Spalte, Diagonale) komplett durchlaufen, dir merken wie viele gleiche Farben du bis zur aktuellen Position schon hintereinander gefunden hast und wenns die vierte mit gleicher Farbe ist, ist das Spiel zu Ende.

In meinen Vier gewinnt Spiel, zähle ich die gefunden Steine. Sind 4 gefunden springe ich raus.
Den Counter zurücksetzen tue ich nach jeder Spalte oder wenn ich eine andere Farbe gefunden habe

Hier meine umsetzung für den Vertikal Check.


private GameStatus CheckVertical(FieldStatus coincolor, FieldStatus[,] fieldstatus)
        {
            int counter = 0;
            for (int col = 0; col ≤ 6 ; col++)
            {
                for (int row = 0; row ≤ 5; row++)
                {
                    if (fieldstatus[row, col] == coincolor)
                    {
                        counter++;
                    }
                    if (fieldstatus[row, col] != coincolor)
                    {
                        counter = 0;
                    }
                    if (counter == 4)
                    {
                        return GameStatus.GameFinished;
                    }
                }
                counter = 0;
            }
            return GameStatus.UserEnabled;
        }

Thema: Wie erstelle ich Textblöcke analog der SelectedCells eines Datagrids?
Am im Forum: GUI: WPF und XAML

Hallo,

Mein Ansatz wäre das IValueConverter Interface zu implementieren.

Grüße

Thema: Wieso stoppt Windows Dienst nach erster Ausführung?
Am im Forum: Rund um die Programmierung

Ich nutze Dependency Injection um meinen Logger zu bekommen. Dafür nutze ich das Interface ILogger<T>, was eigentlich sogar der standard Weg ist bzw sein sollte. Den kann ich sogar mit NLog konfigurieren. Ob der auch mit Serilog konfigurierbar ist weiß ich nicht.


private readonly ILogger<MqttSubcriptionWorker> logger;

public MqttSubcriptionWorker(ILogger<MqttSubcriptionWorker> logger)
{
    this.logger = logger;
}

Thema: Netzwerk Protokoll - Basis
Am im Forum: Code-Reviews

Ich habe ein paar Änderungen durchgeführt. Unter anderem habe die AddPayload Methode umgeschrieben. Außerdem prüfe nun die länge des übergebens byte Arrays, ist dieses zu kurz werf ich eine exception. Ein zu kurzes Array kann gar nicht geparsed werden, da es nicht mal dem Header entsprechen kann... Bleibt nur das Problem, wie ich mit längenmässig validen und erfolgreich geparsten header umgehen, soll die trotzdem verkehrt sind.

/edit Ich habe das parsing der Enums für den Header etwas verbessert, Ich prüfe nun vorher mit IsDefined ob der Value überhaupt im Enum existiert.

Thema: Netzwerk Protokoll - Basis
Am im Forum: Code-Reviews

Hallo T-Virus

Danke für dein Feedback. Du hast bei einigen Punkten Recht da besteht Verbesserungsbedarf, keine Frage. Ich gucke mal was ich wie Umsetze, besonders was Error Handling und das Parsen angeht.

Der Urprünglich von mir angedachte Einsatz Zweck war für TCP/UDP. Meine Aussage war eher als Anregung zu verstehen. Der User kann doch bisweilen sehr Kreativ werden.

Also mein Gedanke war um die Daten versenden, war diese in einem Stream, z.B. die NetworkStream Klasse, zu schreiben. Da die Write und Read Methoden idr mit Byte Arrays aufgerufen werden, war es für mich logisch, dass meine Klassen Byte Arrays zurückgeben sollten.
Nachvollziehbar?

Ich habe noch ein paar Gedanken gemacht:
Sollte ich auf Serialisierung zurückgreifen?
Wie würdet ihr Verschlüsselung einbauen? Ich würde das ganze eher Flexibel haben wollen, damit selbst entscheiden kann was man nutzen möchte oder sollte ich das vorgeben?

Grüße

Thema: Netzwerk Protokoll - Basis
Am im Forum: Code-Reviews

Beschreibung:

Ja was soll ich sagen ursprünglich wollte ich eine Gui Anwendung mit einem Download/Patch Server programmieren. Geplant war das man über die Gui die ausgewählte aktuallisieren kann.
Beim implementieren der Netzwetkschnittstelle habe ich dann gemerkt, dass ich das meine Anwndung ein Protokol braucht, das auf TCP/UDP aufbaut, damit es kommunizieren kann. Wer hätte das gedacht...
Naja meine Idee zu dem Protokoll habe ich jetzt Github veröffentlicht. Dabei ist anzumerken, das ich das eher Snippet sehe und weniger als Projekt. Auch weil viele grundlegende Dinge noch fehlen bzw noch nicht implementiert sind:

-Security - fehlt bisher vollständig, Kommunikation ist unverschlüsselt

-Typ Validierung - der Header verwendet einen generischen Typ für den Message Typ(Type) das führt mit unterschiedlichen Implementationen zu fehlern - hier habe ich noch keine Idee wie ich das Problem lösen könnte.

Aufgrund dieser beiden Punkte möchte folgendes Klar stellen:
Diese Libary ist nicht für den Produktiveinsatz vorgesehen und sollte auch nicht in Produktivumgebungen eingesetzt werden.

Wer es dennoch tut ist selber schlud.

Was kann ich jetzt damit machen?
Meins kann als Basis zur Weiterentwicklung dienen. Dabei sollte man aber mindestens beiden oben genannten Punkte beachten.

Auf welches Protokoll kann ich aufbauen oder welchen Server kann ich nutzen?
TCP und UDP sollten gehen. Eventuell kann man auch auf Mqtt aufbauen oder auch eine Serielle Scnittstelle. Vielleicht findet auch jemand ein Anwendungsbereich als Websocket Protokoll. Wie auch immer mein Protokoll ist nur darauf ausgelegt byte Arrays zu Parsen und zu erstellen, die man von oder in Streams liest/schreibt, wie z.B. den NetworkStream.

Code:
https://github.com/SuperSaurfang/GenericNetworkProtocol

Ich würde über Anregungen freuen
Grüße

Thema: IpAdress MapToIP Methoden liefern eventuell falsche Ergebnisse für IPv4 und IPv6?
Am im Forum: Netzwerktechnologien

Hallo,

Ich habe gestern festgestellt, das man die IPv6 Loopback Addresse nicht in die entsprechende IPv4 Loopback Adresse umwandeln kann bzw. das Ergebnis entspricht nicht dem was ich erwarten würde.

Die Loopback Addresseen sind ::1 für IPv6 und 127.0.0.1 für IPv4.

Wenn ich nun ::1 zu IPv4 mappe bekomme ich 0.0.0.1 als Ergebnis zurück, erwarten würde ich hier aber 127.0.0.1. Für Andere IPv6 Addressen scheint dies zu jedoch richtig zu Funktionieren.

Umgekehrt verhält sich die Methode MapToIPv6 bei IPv4 Addressen auch etwas seltsam.
So wird bei 127.0.0.1 folgendes einfach davor ::ffff: gehängt, das scheint generell bei jeder IPv4 Addresse der Fall zu sein.

Test App:


class Program
    {
        static void Main(string[] args)
        {
            var ipAddresses = Dns.GetHostAddresses("localhost");
            //var ipAddresses = Dns.GetHostAddresses(Dns.GetHostName());
            var ipAddress = ipAddresses[0];

            Console.WriteLine($"Loopback IPv6: {ipAddress.MapToIPv6()}");
            Console.WriteLine($"Loopback IPv4: {ipAddress.MapToIPv4()}");

            ipAddress = ipAddresses[ipAddresses.Length -1];

            Console.WriteLine($"Loopback IPv6: {ipAddress.MapToIPv6()}");
            Console.WriteLine($"Loopback IPv4: {ipAddress.MapToIPv4()}");

            Console.ReadKey();
        }
    }

Ausgabe für localhost:

Loopback IPv6: ::1
Loopback IPv4: 0.0.0.1
Loopback IPv6: ::ffff:127.0.0.1
Loopback IPv4: 127.0.0.1

Ausgabe für Hostname

Loopback IPv6: fe80::e83a:b1d0:426d:8f8d%21
Loopback IPv4: 66.109.143.141
Loopback IPv6: ::ffff:192.168.178.20
Loopback IPv4: 192.168.178.20
Ist das verhalten korrekt oder sollte ich das als Bug melden? Ich bin mir nicht sicher. Was meint ihr?

Thema: NuGet API von Docker Build nicht erreichbar
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo Leute,

Ich Probleme meine ASP.NET Core Webapi in den Docker Container zu bringen. Docker läuft bei mir unter Linux in einer VM auf Windows. Das Projekt habe ich unter Linux angefangen und unter Windows habe ich die Docker Ünterstützung für Linux hinzugefügt. Ich habe auch schon ein komplett neues Projekt erstellt ohne Code und ohne alles nur mit Docker Ünterstützung für Linux.

Es scheitert daran das ich beim Docker Build dotnet restore mit folgender Meldung fehlschlägt:


/usr/share/dotnet/sdk/3.1.301/NuGet.targets(128,5): error : Unable to load the service index for source https://api.nuget.org/v3/index.json. [/app/DockerTestApp.sln]
/usr/share/dotnet/sdk/3.1.301/NuGet.targets(128,5): error :   Resource temporarily unavailable [/app/DockerTestApp.sln]
The command '/bin/sh -c dotnet restore' returned a non-zero code: 1

Ich habe schon im Internet danach gesucht, aber keine Lösung für mein Problem gefunden. Zuerst dachte ich, das würde irgendein Netzwerkproblem mit der Docker Bridge sein. Aber dies kann ich eigentlich aus folgenden Gründen ausschließen:
1. Ich habe von Windows aus Zugriff auf Internet
2. Ich habe von der VM aus Zugriff auf das Internet
3. Die Beispiel Anwendung aus dem dotnet-docker Repo wird gebaut und ausgeführt in meinen Docker.


Ich habe mir auch den Container während des Builds vorgangs angesehen, die sln befindet sich in den Build Ordner.

Hier der Inhalt meines Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY DockerTestApp/*.csproj ./DockerTestApp/
RUN dotnet restore

# copy everything else and build app
COPY DockerTestApp/. ./DockerTestApp/
WORKDIR /app/DockerTestApp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "DockerTestApp.dll"]

Weiß jemand weiter oder hab ich etwas vergessen?

Grüße

Thema: Webapi Datenbank Schnittstelle <-> MariaDB und MongoDB
Am im Forum: Datentechnologien

Hallo Leute,

Ich schreibe gerade eine .Dot Core WebApi, die auch eine Schnittstelle zur einer Datenbank bzw. zu den beiden im Titel Datenbanken genannten hat. Grundsätzlich funktioniert das auch, das ich eine der Beiden Datenbanken nutzen kann, je nach dem was in der Config eingestellt ist.
Meine Idee war dabei folgende:
Über eine Config Datei kann man festlegen welche Datenbank genutzt werden soll. Es ist nicht vorgesehen, beide Datenbanken parallel zu nutzen, es kann zur Laufzeit nur eine Datenbank genutzt werden. Wenn eine Andere Datenbank genutzt werden soll muss die Config angepasst werden und die Webapi neu gestartet werden.
Programmier Technisch habe ich das so gelöst, dass die Controller Klasse nur das Interface kennt, das je nach verwendeter Datenbank unterschiedlich implementiert ist. In der Startup Klasse wird je nach Config dann die entsprechenden Service Klassen aktiviert.

Grundsätze Frage: Was haltet ihr von der Idee unabhängig davon, dass das tatsächlich Funktioniert?

Nun zu meinen Problem:
Die MongDB verwendet ein komplett anderes Id System als eine SQL Datenbank, eine ObjectId, die für jedes "Object" in der Datenbank einzigartig ist. Während eine SQL Datenbank dafür idr. ein Integer als Primary Key und AI für eine Tabelle hat.
Meine Lösung wäre hier, das ich in der MongoDB noch eine Funktion implementiere mit der ich ein Feld hochzählen kann.

Grüße