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 gfoidl
Thema: In Applikation alternativ 32-bit oder 64-bit DLL verwenden
Am im Forum: Rund um die Programmierung

Hallo oehrle,

Zitat
das ich dazu eine DLL bekommen habe, die mit 32-Bit Architektur erstellt ist
Eine .NET DLL od. eine native DLL?
Zitat
Nun habe ich den Eindruck, dass die Appliaktion nun öfters abschmiert, ... viel Arbeitsspeicher
Hast du dazu eine Fehlermeldung od. einen Eintrag in der Windows-Ereignisanzeige?
32bit Anwendungen / Prozesse können auf weniger Arbeitsspeicher (korrekter: virtuellen Speicher) zugreifen als 64bit Prozesse, aber ich glaube eher nicht dass dies das Problem ist. Falls doch solltest du OutOfMemoryExceptions sehen -- die aber nicht zwangsläufig mit zu wenig Speicher zu tun haben müssen (sondern ein paar andere Gründe haben können wie hauptsächlich dass der GC keinen Platz findet um das Objekt der gewünschten Größe zu alloziieren).

mfG Gü

Thema: Visualle Unterschiede in einem Bild erkennen
Am im Forum: Grafik und Sound

Hallo Christoph K. ,

schau mal bei Google Suche nach "image similarity"
Auf diesem Gebiet hat sich in letzter Zeit ziemlich viel getan (ganz am aktuellen Stand bin ich selbst nicht, daher nur der Suchlink).
Für gute und brauchbare Ergebnisse würde ich ein bewährtes Framework verwenden, anstatt das selbst zu programmieren (z.B. per Farbhistogramm-Ähnlichkeit).

mfG Gü

Thema: Vereinfachung If Ausdruck
Am im Forum: Rund um die Programmierung

Hallo Nejox,

Zitat
Gibt es hier eine Schreibweise die mir das ganze etwas abkürzen kann?
Nein.
In C# muss das explizit für jeden "Test" angegeben werden. Für Möglichkeiten siehe T-Virus' Antwort.

Weil es irgendwie zum Thema passt:


static bool IsZero(int a, int b) => a == 0 || b == 0;
kann, da es Ganzzahlen sind, vereinfacht werden zu


static bool IsZero(int a, int b) => (a | b) == 0;
Das spart eine Verzweigung im Code und ist daher auch performanter. Leserlicher ist vermutlich nicht für alle, da Bit-Operationen vorkommen, daher gibt es in .NET 6 (Herbst 2021) eine Optimierung im JIT, welche aus dem ersten Code den zweiten macht.

Aber für Referenzen, wie in deiner Frage, geht das nicht.

mfG Gü

Thema: String auf mehrere Zeilen prüfen
Am im Forum: GUI: Windows-Forms

Hallo,

Zitat
aber nur beim alten Classic Mac OS, seit Mac OS X wird (wie bei Unix) '\n' benutzt
Würde jetzt Windows auch nur noch auf \n setzen, so wäre etlicher Code einfacher und performanter (beides zugleich: Juhuu) zu schreiben.
Ist vermutlich mehr ein Wunsch als (nahe) Realität.

mfG Gü

Thema: String auf mehrere Zeilen prüfen
Am im Forum: GUI: Windows-Forms

Hallo T-Virus ,

Zitat
Bei .NET 5 ist es nun auf "\n" umgestellt, da klappen beide Fälle.
source.dot.net sucht in der Unix-basierten Runtime, daher ist deine Aussage nicht ganz vollständig.

Environment.UnixOrBrowser.cs <-> Environment.Windows.cs.

mfG Gü

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Hallo Sascha87,

Zitat
Post bitte löschen.
Posts bzw. Threads werden i.d.R. nicht gelöscht, da sie ja auch für die Community interessant sein können und "gemeinsam mehr erreichen" gilt.
Wenn der Thread aber "erledigt" ist, so kannst du den Titel (via Startbeitrag editieren) mit einem [erledigt] voranstellen, damit diese deutlicher sichtbar ist.

mfG Gü

Thema: Parsen von HTTP User Agents mit .NET
Am im Forum: Projekte

Hallo zusammen,

Zitat
im Rahmen der Analyse der Leistung des Forums aufgefallen ist, dass unser bisheriger Parser (UA Parser)
Dazu als Ergänzung / Erklärung.

UA Parser kann ziemlich viele User Agents parsen, aber (leider) ist die .NET Bibliothek ein ziemlich direkter Port des JavaScript Projekts. Das macht sich v.a. durch die unzähligen Closures bemerkbar und sind in einem GC-Dump deutlich sichtbar -- siehe Anhang.

Für eine Web-Anwendung hätte ich mir Objekte von Kestrel (Server), MVC, EF Core, etc. erwartet und nicht dass eine "Hilf-Bibliothek" dort so dominant zu sehen ist.
BTW: unser eigener Code, abgesehen vom DbContext, taucht erst relativ weit unten auf und ist in diesem Abschnitt nicht zu sehen.

Thema: Frage zu Interpolation
Am im Forum: Rund um die Programmierung

Hallo STF-DIR ,

hilft dir bilineare Interpolation weiter?
(ist die einfache lineare Interpolation angewandt auf 2D)

mfG Gü

Thema: Filter Liste mit Linq
Am im Forum: Rund um die Programmierung

Hallo zusammen,

Ergänzung für die Micro-Optimierungen:

Laufzeit ist eine Sache, aber je nach Kontext können auch die Allokationen eine Rolle spielen.
Hier im Thema vom OP geht es um eine Desktopanwendung, da wird wohl eher die Laufzeit eine Rolle spielen, da die GC-Arbeit sich nicht so bemerkbar machen wird.
Bei Server-Anwendungen hat der GC mMn mehr Gewichtung in der Entscheidung Laufzeit <-> Allokationen, da dort u.U. viel CPU-Zeit für das Aufräumen vom Speicher benötigt werden kann. Und der beste Weg dem GC weniger Arbeit zu machen ist einfach weniger zu Allozieren.

Wenn es eine Entscheidung / Tradeoff zwischen Laufzeit und Allokationen zu machen gilt, so sollte diese basierend auf Metriken wie Requests pro Sekunde, Antwortzeiten / Latenz, etc. getroffen werden. Also das größere Bild über eine längeren Zeitraum betrachtet werden und nicht nur ein Micro-Benchmark*. Letztere finden isoliert statt und v.a. wenn es Allokationen gibt, so wird das Zusammenspiel mit anderen Allokationen der Anwendung nicht real abgebildet. Daher können auch keine Pauschal-Aussagen getroffen werden, was eindeutig zu bevorzugen ist.

* Micro-Benchmarks sind ein Mittel um Varianten zu beurteilen, haben auch gewissen Einschränkungen die nicht außer Acht gelassen werden sollten. Neben den angesprochen Allokationen sind auch ein paar CPU-Effekte (Branch-Prediktor, Caches, ...) zu berücksichtigen und daher spiegeln sie oft nicht die Realität wider.

Wenn ich den obigen Benchmark ein wenig ergänze


using System.Collections.Generic;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Running;

BenchmarkRunner.Run<LinqTest>();

[MemoryDiagnoser]
[CategoriesColumn]
[GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)]
public class LinqTest
{
    private List<string> _list;

    [GlobalSetup]
    public void Setup()
    {
        _list = Enumerable.Range(0, 100).Select(c => c.ToString()).ToList();
    }

    [Benchmark(Baseline = true, Description = "Count only")]
    [BenchmarkCategory("Count")]
    public int Count() => _list.Count(e => e.Contains("a"));

    [Benchmark(Description = "Where Count")]
    [BenchmarkCategory("Count")]
    public int WhereCount() => _list.Where(e => e.Contains("a")).Count();

    [Benchmark(Baseline = true, Description = "First only")]
    [BenchmarkCategory("First")]
    public string First() => _list.FirstOrDefault(e => e.Contains("a"));

    [Benchmark(Description = "Where First")]
    [BenchmarkCategory("First")]
    public string WhereFirst() => _list.Where(e => e.Contains("a")).FirstOrDefault();
}

so kommt bei mir dabei
|        Method | Categories |     Mean |     Error |    StdDev | Ratio | RatioSD |  Gen 0 | Gen 1 | Gen 2 | Allocated |
|-------------- |----------- |---------:|----------:|----------:|------:|--------:|-------:|------:|------:|----------:|
|  "Count only" |      Count | 2.184 μs | 0.0433 μs | 0.0405 μs |  1.00 |    0.00 | 0.0114 |     - |     - |      40 B |
| "Where Count" |      Count | 1.293 μs | 0.0249 μs | 0.0341 μs |  0.59 |    0.02 | 0.0229 |     - |     - |      72 B |
|               |            |          |           |           |       |         |        |       |       |           |
|  "First only" |      First | 2.350 μs | 0.0427 μs | 0.0399 μs |  1.00 |    0.00 | 0.0114 |     - |     - |      40 B |
| "Where First" |      First | 1.861 μs | 0.0364 μs | 0.0357 μs |  0.79 |    0.02 | 0.0229 |     - |     - |      72 B |

heraus.
Anmerkung: die absoluten Laufzeit-Werte sind uninterssant, es geht nur um das Verhältnis zwischen den Varianten.

Die Varianten Where + Count / First sind also gut 20-40% schneller, allozieren aber um 80% mehr (da zwei Linq-Enumeratoren benötigt werden).
Hier haben wir also das vorhin erwähnte Tradeoff-Problem zwischen Laufzeit und Allokationen.

Was würde ich nun tun?
Desktopanwendung: das Where-Count wie von Abt empfohlen verwenden. Das ist leserllich -- mindestens genauso gut wie nur Count -- und schneller. Dass ein wenig mehr alloziert wird stört nicht.
Serveranwendung: mit Where-Count starten. Sollte es in einem Profil (entweder CPU od. GC) als großer Einfluss auftauchen, so vermutlich auf Linq verzichten und selbst über die Auflistung iterieren, v.a. wenn ich weiß dass es eine List ist kann das performanter und ohne Allokation durchgeführt werden. Wenns aber nicht in einem Profil auftaucht, so erspare ich mir die Arbeit und gehe dein einfachen Weg.


mfG Gü

Thema: async Task<bool>
Am im Forum: Grundlagen von C#

Hallo TheGateway,

warum überhaupt async wenn im Code nur synchrone Teile vorkommen? Od. ist das Beispiel zu sehr gekürzt?

Zitat
bekommt man die forearch auch irgendwie async ?
Mit C# 8 async Streams ist es möglich.
Macht aber nur Sinn wenn es tatsächlich asynchrone Vorgänge sind (z.B. Datenbank, HTTP-Requests, etc.)

Noch etwas: [Tipp] Anfängerhinweis == true / == false


mfG Gü

Thema: "Duplikate" mit Revisionsnummer auflisten
Am im Forum: Datentechnologien

Hallo dscNRW,

was soll denn passieren wenn mehr als eine Revision vorhanden ist?

Als Denkanstoß allgemein: group by und / oder max bzw. min.

mfG Gü

Thema: Eigenen Auth-Handshake über TCP entwickeln
Am im Forum: Netzwerktechnologien

Hallo Loofsy,

wenn Abts Vorschläge nicht angewandt werden können*, so kann der ASP.NET Core WebServer Kestrel dazu verwendet werden. Als Beispiel siehe MultiProtocolAspNetCore. D.h. Kestrel, als verifizierter WebServer, übernimmt die ganze Arbeit für dich und du brauchst nur via ConnectionHandler die Logik hinzufügen.

* sollte das ein Vorgesetzter so vorschreiben, so hat dieser keine Ahnung und betreibt Geld- / Ressourcenvernichtung

mfG Gü

Thema: Asynchron in mehreren Threads Daten Generieren führt hin und wieder zur NullReferenceException?
Am im Forum: Rund um die Programmierung

Hallo Sebastian1989101,

ehrlich gesagt hab ich noch nicht ganz verstandes was erreicht werden soll, aber so wie ich es verstanden habe wäre Parallel Linq / PLinq eine Option dafür.
Duplikate können mit GroupBy "gefiltert" werden, etc.

mfG Gü

Thema: Roslyn: CSharpCompilation.Emit missachtet Referenzen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Fabiano,

die Solution kompiliert bei mir wenn ich in Fipscode.CodeGenerator.csproj diie Referenzen hinzufüge:


<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="System.CodeDom" Version="5.0.0" />
        <PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
    </ItemGroup>

</Project>

BTW: ich dachte es ist ein Roslyn Source Generator. Sind dir diese bekannt? Damit kann zur Entwurfszeit Code erstellt werden und verweidet dies zur Laufzeit -- sofern möglich.

mfG Gü

Thema: Roslyn: CSharpCompilation.Emit missachtet Referenzen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Fabiano,


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

</Project>

Hat mich auch schon ein paar Nerven gekostet, aber es geht (momentan) nur mit .NET Standard 2.0 als TFM.

Edit: dazu gibt es eine Issue Don't limit Source Generators to "netstandard2.0" target framework · Issue #45162 · dotnet/roslyn

mfG Gü

Thema: Stacktrace von einem Thread ausgeben
Am im Forum: Rund um die Programmierung

Hallo Th69,

du hast die Möglichkeit eines unglücklich gewählten Ausdrucks vergessen ;-)

Gemeint ist damit, dass in VS der Debugger ähnliche Möglichkeiten wie beim F5-Debuggen bietet. Nur die tatsächliche Ausführung vom Code findet nicht statt (wie auch).
Also wenn jemand Erfahrung mit dem VS-Debugger hat, so bietet sich hier eine ähnliche Erfahrung an.

(Kann gut sein, dass heute mein Deutsch nicht recht besonders ist)

mfG Gü

Thema: Stacktrace von einem Thread ausgeben
Am im Forum: Rund um die Programmierung

Hallo Sebrahi,

Zitat
Um zu schauen wo der Thread hängt um den Fehler zu beheben wäre es für mich sehr sinnvoll zu wissen wo es hängt.
Da rate ich dir zu Dump files in the Visual Studio debugger.
Erstell also einen Dump (kann auch automatisch erfolgen) und analysiere diesen. Einfach gehts mit Visual Studio. Dort den Dump öffnen und du bekommst eine Debugger-Erfahrung. Kannst dir also die Threads inkl. Stack ansehen, Variablen-Werte, etc.

Weniger einfach, dafür aber mit mehr Möglichkeiten, gehts mit WinDbg und SOS-Erweiterung. Aber VS tut es i.d.R. auch.

mfG Gü

Thema: Stacktrace von einem Thread ausgeben
Am im Forum: Rund um die Programmierung

Hallo Sebrahi,

eine direkte Unterstützung für dein Vorhaben gibt es in .NET nicht*.
Das "Stack walking" ist aber ein Runtime-Feature, das intern oft verwendet wird. Nicht nur bei Fehlern, sondern v.a. während einer Garbage Collection um "Roots" in Form von lokalen Variablen (die auf dem Stack liegen) zu finden.

Wenn du nun die Stack-Information eines anderen Threads (wirklich) während der Programmausführung benötigst, so würde ich das via Debugger-/Profiler-APIs machen da es dort Zugriff auf die Stacks gibt. Aber recht trivial ist das nicht.

Sollte der Code im Thread unter deiner Kontrolle sein, so kannst du dort ja via Event, Callback etc. den StackTrace generieren lassen mittels


StackTrace stackTrace = new(fNeedFileInfo: true);   // vom jeweils aktuellen Thread
Console.WriteLine(stackTrace);

Als Textrepräsentation gibt es auch Environment.StackTrace vllt. reicht dir diese Info schon aus? Wenn die Debug-Symbole (*.pdb) vorhanden sind, so werden auch die Zeilennummern angezeigt.
Übrigens gibt es dafür für .NET Core eine nette neue Projekteinstellung um die Debug-Symbole direkt in die Assembly einzubetten, so dass diese immer vorhanden sein und kein Symbol-Server benötigt wird:

<PropertyGroup>
    <DebugType>embedded</DebugType>
</PropertyGroup>

Gehts hingegen eher um "post mortem" Analysen, so können Heapdumps mit Debuggern (bzw. Erweiterungen) wie SOS diese Information liefern.

* früher gab es noch die Überladung new StackTrace(thread, ...)

mfG Gü

Thema: Ereignisse in C#
Am im Forum: Grundlagen von C#

Hallo Speedys_Work,

[FAQ] Kommunikation von 2 Forms kann hier analog angewandt werden.

mfG Gü

Thema: Task mit spez. Namen starten/killen
Am im Forum: Grundlagen von C#

Hallo M.Lach ,

ja.

mfG Gü

Thema: Task mit spez. Namen starten/killen
Am im Forum: Grundlagen von C#

Hallo M.Lach ,

Zitat
nur in der Taskliste (Taskmanager)
Meinst du jenen von Windows?
Das wäre somit ein Prozess der gestartet werden muss. Angezeigt wird dort der Prozessname (von z.B. der exe).
Zitat


Task t = Task.Run(new Action(taskname2));
Das ist ein Task-Objekt.
Dem kann kein Name gegeben werden. Einem Thead kannst du benennen, damit z.B. in der Thread-Übersicht das erkenntlich ist.
Zitat
Und wie "kille" ich dann diesen wieder?
Entweder lebt der Prozess od. Task von alleine ab, wenn die Aktion, die ausgeführt werden soll, fertig ist od. der Prozess wird geKillt, der Task kann abgebrochen werden mittels Task cancellation.

Was hast du wirklich vor?

mfG Gü

Thema: Fehlermeldungen zentral abfangen ohne Programm danach zu beenden
Am im Forum: Rund um die Programmierung

Hallo DeSchneller,

das switch kannst du dir -- zumindest wie es da steht -- sparen, da keine Fälle unterschieden werden (nur der default-Fall ist da).
Fürs switch schau dir auch Using pattern matching switch statements an.

Zitat
Wie kann ich das verhindern?
Es gibt auch Fehler die nicht behandelbar sind und den Prozess zwangsweise beenden. Z.B. StackOverflowException, OutOfMemoryException udgl. Siehe dazu auch AppDomain.UnhandledException.

Um welchen Tech-Stack handelt es sich: WinForms, WPF, ...?

Für die MessageBox interessant als Lektüre: Nenne deinen Fall, wo du denkst, ohne modalen Dialog geht es nicht, und ich nenne eine Alternative

mfG Gü

Thema: Ich realisiere Parallel.Invoke mit await Task.Run , gibt es Nachteile oder Unterschiede?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Sebrahi,

Ergänzung / Hinweis:

Zitat von T-Virus
Parallel.Invoke auf den Abschluss der Operationen wartet.
Und zwar derart dass der aufrufende Thread (z.B. der Main-Thread) blockiert od. für eine Operation der auszuführenden verwendet wird.
Daher ist auf [FAQ] Warum blockiert mein GUI? zu achten.

Würde der Code wie folgt geschrieben sein


public static async Task Start_myMethod1_asyncron()
{
    await Task.Run(() => {
        myMethod1();
    });
}
public static async Task Start_myMethod2_asyncron()
{
    await Task.Run(() => {
        myMethod2();
    });
}

public static async Task Main(string[] args)
{

    await Task.WhenAll(Start_myMethod1_asyncron(), Start_myMethod2_asyncron());

    //difference?

    Parallel.Invoke(myMethod1, myMethod2);

}
so wird zwar per Task.WhenAll auf das Ende der Ausführungen asynchron gewartet (await), aber während dieser Zeit ist der aufrufende Thread (hier: Main-Thread) "frei" und könnte andere Aufgaben erledigten.
Beim Parallel.Invoke ist das wie erwähnt nicht möglich.

Das soll jetzt nicht heißen dass Parallel.Invoke eher schlecht ist, sondern je nach konkreter Aufgabe kann es sogar sehr nützlich sein.

Zitat von T-Virus
Wenn du einfach stumpf Methoden aufrufen willst, die auch keinen Rückgabewert/Parameter haben, kannst du das mit Parallel.Invoke machen.
Parallel Linq (PLinq) ist eine weitere Option die ganz passend sein kann.

mfG Gü

Thema: C# Intersection
Am im Forum: Grundlagen von C#

Hallo Borbes,

kannst du bitte genauer schreiben was du erreichen willst?
Hab die Frage jetzt ein paar mal gelesen, so wirklich schlau werde ich daraus nicht.

Können die Zahlen in den Listen beliebig angeordnet sein?
Streng genommen bei einer Liste ja nicht, aber meinst du Menge? Dann wären alle Permutation von {1, 2, 3} gleichwertig zu betrachten.

Die Schnittmenge an sich ist ja exakt definiert, aber was verstehst du unter "Schnittmenge" bzw. was soll herauskommen? Beim gezeigten Beispiel dass die 5. mit den anderen ähnlich ist od. dass auch 5 in der Schnittmenge ist?

Gehts um einen Ähnlichkeitsvergleich von gegeben Listen?
"Ähnlichkeitsmaße" gibt es ja etliche und je nach Kontext besser geeignet. Noch hab ich aber keine Ahnung worum es wirklich geht.

Der Ansatz von dannoe ist grundsätzlich vernüftig, nur passt dieser zur Aufgabe?

mfG Gü

Thema: Jahr Angabe - Hilfe für einen Beginner
Am im Forum: Grundlagen von C#

Hallo Wilfried,

ist eine schöne Lösung!
Nur wenn in die Zukunft (z.B. 2030) gegangen werden soll, so klappt das nicht, da 1930 herauskommen würde.

Daher sollte der Hinweis von Stefan.Haegele unbedingt berücksichtigt werden.

mfG Gü

Thema: Jahr Angabe - Hilfe für einen Beginner
Am im Forum: Grundlagen von C#

Hallo T-Virus,

Zitat
Für das jahr Problem kannst du ja einfach prüfen ob das Jahr kleiner als 1000 ist.
Wenn ja, dann kannst du einfach + 2000 drauf rechnen und hast das entsprechende Jahr.
Kommt darauf an welches Regelwark gelten soll. Ist 50 2050 od. 1950? Je nachdem sollte ein präzisere Unterscheidung (siehe oben) durchgeführt werden.

mfG Gü

Thema: Jahr Angabe - Hilfe für einen Beginner
Am im Forum: Grundlagen von C#

Hallo specialist,

schau mal:


using System;

#nullable enable

while (true)
{
    Console.Write("Bitte gib diesen Monat in Zahl ein: ");
    string? monthInput = Console.ReadLine();

    if (!int.TryParse(monthInput, out int month) || (month < 1 || month > 12))
    {
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine("Ungültiger Wert für einen Monat eingegeben. Erlaubt sind Zahlen 1 bis 12.");
        Console.ResetColor();
        continue;   // Schleife wieder von vorne beginnen
    }

    Console.Write("Bitte gib das Jahr ein: ");
    string? yearInput = Console.ReadLine();

    if (!int.TryParse(yearInput, out int year))
    {
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine(@"Ungültiger Wert für ein Jahr eingegeben. Erlaubt sind Zahlenwerte, wobei eine zwei Ziffern Eingabe
wie folgt behandelt wird:
jj <  50 -> 20jj
jj ≥ 50 -> 19jj");
        Console.ResetColor();
        continue;   // Schleife wieder von vorne beginnen
    }

    year += year switch
    {
        < 50 => 2000,
        ≥ 50 and < 100 => 1900,
        _ => 0
    };

    DateTime dateTime = new DateTime(year, month, 1);

    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine($"Wir haben {dateTime:MMMM yyyy}");
    Console.ResetColor();
}
Davon ausgehend kannst du es beliebit erweitern bzw. das dir Unbekannte nachlesen (in der Doku). Wenn du dann irgendwo hängst, so frag einfach nach.

mfG Gü

Thema: ASP.NET WebAnwendung soll mit Windows Dienst sprechen
Am im Forum: Web-Technologien

Hallo Pardasus,

Zitat
einen Windows Dienst
Läuft dieser auf .NET Full od. .NET Core?
Ich würde Letzteres bevorzugen, einfach da es mehr Möglichkeiten gibt.
Zitat von Pardasus
Seite bauen die Informationen darüber anzeigt, was der Dienst den gerade so treibt.
Je nachdem welche Informationen und in welchem Intervall gibt es verschiedene Varianten in Ergänzung zu Abts Beitrag.
Die hier angeführten können als "Push-Modell" betrachtet werden im Gegensatz zu den bisher genannten "Pull-Modellen".
  • Der Windows-Service ist zugleich ein SignalR-Server, der "Notifications" aussendet und diese werden von der Monitoring-Seite abonniert.
  • Der Windows-Service hat eine EventSource und schreibt in diese die Log-Events, die Monitoring-Seite ist eine Senke dieser Events in Form eines EventListeners

Letztere Variante bietet durch diese Infrastruktur (ist einfacher als es ausschaut) auch die Möglichkeiten mit Diagnose-Werkzeugen ala dotnet-trace, Visual Studio, etc. diese Ereignisse zu analysieren. Od. durch einen speziellen EventListenere auch Alarme zu erzeugen falls eine Metrik eine bestimmten Grenzwert übersteigt / unterschreitet.

Kannst du ein bischen konkreter werden welche Infos angezeigt werden sollen? Damit die Möglichkeiten besser bewertet werden können.
Und auch ob Windows-Service und die Monitoring-Seite im selben Netz / Rechner sind spielt eine gewisse Rolle (Sicherheit).

mfG Gü

Thema: List<> Generic in Basisklasse
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo jkrt,

Zitat
ich lese die Softwareversion des Gerätes und muss dann abhängig von dieser die Daten empfangen und verarbeiten.
um ein paar Entwurfsmuster die da angewandt werden können zu nennen und um dir ein schönes Wochenende zu bereiten ;-)
Damit kannst du die Unterscheidung durchführen und dann mit der konkreten Instanz die Daten lesen / halten.

mfG Gü

Thema: Aufbaue einer Datenbankabfrage mit variablen Filtern
Am im Forum: Datentechnologien

Hallo Kriz,

genau.

Statt simplen String-Verkettungen würde ich aber einen QueryStringBuilder erstellen.
Zuerst die einzelnen Filter in einer Liste speichern und dann daraus am Ende das SQL Statement erzeugt, da so auch einfach parametrisierbar ist.
So kannst du problemen mit den and-"Verknüpfungen" von vornhinein aus dem Weg gehen.

Klar?

mfG Gü