Laden...
Avatar #avatar-2894.jpg
gfoidl myCSharp.de - Team
Entwickler in der Gasmotorenbranche (nicht nur Software) Waidring Dabei seit 07.06.2009 6.911 Beiträge
Benutzerbeschreibung
FIS-Speedski (S-DH) world champion 2015 3x FIS-Speedski (S-DH) overall worldcup winner, 2008/09, 2009/10, 2012/13 5x Subaru Velocity Challenge winner, 2009, 2010, 2013, 2014, 2015 7x PopKL Verbier winner, 2009 2x, 2010 2x, 2011 2x, 2013 1x 27 victories in 69 international Speedski-races v_max = 208,333 km/h http://de.wikipedia.org/wiki/Günther_Foidl

Forenbeiträge von gfoidl Ingesamt 6.911 Beiträge

04.08.2018 - 17:38 Uhr

Hallo a957m,

oder statt dem HashSet<T> aus MrSparkles Beispiel allgemein ein IEnumerable<T> als Argument übergeben.

mfG Gü

31.07.2018 - 15:25 Uhr

Hallo LaTino,

Windows-Authentifizierung mit IIS und Kestrel

Mit IIS und Kestrel nicht, aber mit IIS und der Authentication Middleware.
Ein paar Einstellungen müssen angepasst werden, siehe z.B. How to Support Windows Authentication for ASP.NET Core in IIS

mfG Gü

30.07.2018 - 21:09 Uhr

Hallo,

kennt aber ASP.NET Core IIS nicht, da bei Core KESTREL als Reverse Proxy dazwischen hängt.

der IIS ist der Reverse Proxy und Kestrel der (Web-) Server der mit der ASP.NET Core Anwendung "spricht".

Die Anwendung sollte gar nicht wissen dass vor "ihrem" Server (Kestrel) in Reverse Proxy (IIS od. Nginx, etc.) ist, daher gibt es auch keinen direkten Weg die Bindungen auszulesen, nur über Umwege wie oben in der verlinkten Issue erwähnt.

mfG Gü

30.07.2018 - 12:21 Uhr

Hallo Glowhollow,

Leider verstehe ich nicht so ganz genau was da gemeint ist.

Als Hintergrund: Data structure alignment
Es geht darum wie die Felder des Structs (das Attribut kann übrigens auch für Klassen verwendet werden) im Speicher angeordnet sind und ob es dem Compiler gestattet ist zwischen den Felder Padding einzufügen oder nicht.

Ein Nutzen ist Interop mit nativem Code, bei dem die Feldanordnung fix gegeben ist.

Ein weitere Nutzen ist Optimierung, da so die Felder "aligned" werden können und das bietet u.U. besseren Speicherzugriff und/oder kleinere Structs und somit weniger Speicherverbrauch (der u.U. in weniger Arbeit für den GC resultieren kann, falls das Struct in einem Object (Klasse od. durch Boxing) verwendet wird, da es dann auf dem Heap landet).
Dieser Nutzen ist aber "premature optimization is the root of all evil" und sollte daher nur durch ausreichendes Profiling angewandt werden.

mfG Gü

09.07.2018 - 10:04 Uhr

Hallo pinki,

das ist schön 😃 und genauso sollte open source gelebt werden.

mfG Gü

06.07.2018 - 10:07 Uhr

Hallo,

das ist ein Beispiel bei dem auch mit Span<T> gearbeitet werden kann.


public static IEnumerable<int> GetWindowedMax(this int[] source, int windowSize)
{
    int windows = source.Length / windowSize;

    for (int i = 0; i < windows; ++i)
    {
        Span<int> span = source.AsSpan(i * windowSize, windowSize);
        yield return GetMax(span);
    }
}

private static int GetMax(Span<int> span)
{
    int max = int.MinValue;

    for (int i = 0; i < span.Length; ++i)
    {
        if (span[i] > max) max = span[i];
    }

    return max;
}

(Code ohne Argument-Validierung und nicht optimiert).

mfG Gü

02.07.2018 - 09:39 Uhr

Hallo pinki,

Die Ausgabe der von Moq geworfenen MockException finde ich dennoch nicht so in Ordnung

In diesem Fall könntest (und solltest) du in https://github.com/moq/moq4/issues eine Issue erstellen, damit das u.U. geändert werden kann.

mfG Gü

30.06.2018 - 09:57 Uhr

Hallo pinki,

tja, das ist das Problem mit Gleitkommazahlen 😉

Wenn es um Vergleiche geht und es möglich ist int zu verwenden, so sollte auch int verwendet werden, da so die Vergleiche exakt durchführbar sind.

Hier könntest eben Zahlen aus dem Intervall [0, 100] übergeben und gut ist es.

[FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler

mfG Gü

27.06.2018 - 15:20 Uhr

Hallo,

damit Du nicht zu viele Arrays allozierst. ArrayPool verwenden. Ob dann auf die Arrays via Span<T> zugegriffen wird ist eine andere Geschichte (aber meist eine vorteilhafte).

mfG Gü

26.06.2018 - 10:35 Uhr

Hallo LaTino,

Git hat den Fokus auf Integration, svn auf Kollaboration

Wirklich? Gerade für Kollobaration -- für mich das Zusammenarbeiten mehrer Entwickler -- sehe git klar im Vorteil und das zeigen auch die Erfolge von git-Plattformen wit GitHub, etc.
Der Grund liegt im verteilten Konzept von git, während SVN auf Zentralisierung setzt.

dass man zufrieden ist und keinen Grund sieht, zu wechseln.

Genaus so war es bei mir auch, bis ich in die git-Ecke gestupst wurde und seitdem sehr froh über diesen Schritt bin.
Wenn jemand nichts Anderes kennt, so ist leicht mit dem was man hat zufrieden zu sein. Reisen bringt neue Erfahrungen und so lässt sich die Zufriedenheit anders bewerten 😉

mfG Gü

25.06.2018 - 15:01 Uhr

Hallo Christoph1972,

vor ein paar Jahren, bevor ich von SVN zu git migrierte, hatte ich ähnliche Gedanken / Sorgen. Nach der Migration zu git bereute ich nur, dass ich nicht schon früher diesen Schritt vollzogen hatte. git ist v.a. wenn mehrere Zweige im Spiel sind SVN weit überlegen.

Neben der CommandLine nutze ich auch TortoiseGit fürs git-GUI (und manchmal auch den in VS integrierten).

Einen lokalen Server brauchst du bei git auch nicht. Ein git init in einem Ordner reicht und schon ist das Repo einsatzbereit.

Für "Server"-Lösungen gibt es genug Anbieter, siehe die anderen Antworten.

SVN war einmal das Non plus ultra, aber diese Zeiten sind vorbei 😉

mfG Gü

20.06.2018 - 20:37 Uhr

Hallo ill_son,

beim Deserializieren eines Objektes den Pfad der Quelldatei als readonly Property mit im Objekt speichern

Was machst du wenn beim Deserialisieren kein FileStream verwendet wird, sondern ein anderer Subtyp von Stream?

Wenn schon, so würde ich das Objekt wie folgt aufbauen:


public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class MetaPerson : Person
{
    public string XmlFileName { get; }
}

Also mit "Meta"-Klasse, so dass das eigentlich (Daten-) Objekt davon unberührt bleibt.

Gibt es da einen offiziellen Weg? IXmlSerializable implementieren, aber das ist ziemlich aufwändig.

Einen eigenen Xml-Serialisierer durch Erben von XmlSerializer erstellen und die nötigen Methoden überschreiben. Ist u.U. einfacher als IXmlSerializable zu implementieren.

Den DataContractSerializer verwenden und OnDeserialized auf eine Methode der Klasse klatschen. Das hat jedoch den Nachteil, dass du in der Klasse eine Abhängigkeit zum Serialisieren aufbaust -- genauso wie bei der Möglichkeit bei IXmlSerializable.

Wenn das Objekt stets vom gleichen Typ ist, so wäre auch Linq2Xml eine Möglichkeit, spricht manuelle Deserialisierung.

mfG Gü

19.06.2018 - 21:18 Uhr

Hallo SamsonBB,

fürs Ermitteln der Änderungen suche auch nach "diff". Da gibt es schon eine Menge und so brauchst du nicht bei 0 zu beginnen.

Die Levenshtein-Distanz sehe ich hier nicht unbedingt von Vorteil, eher den "longest common substring", aber wie erwähnt siehe diff.

mfG Gü

18.06.2018 - 12:34 Uhr

Hallo _Cashisclay,

kennst du [Artikelserie] SQL: Parameter von Befehlen ? Damit sollte deine Frage geklärt werden und gleichzeitig guter Programmierstil gelehrt werden.

mfG Gü

14.06.2018 - 10:44 Uhr

Hallo weismat,

sicher?

Nur weil async dort steht, ist es noch lange nicht asynchron. async ist für den Compiler nur der Hinweis, dass ein await in der Methode folgt bzw. folgen kann und er dann diese Methode durch die Async-Statemachine zu ersetzen hat bzw. wenn diese Statemachine nicht selbst im Code angegeben wurde*, so dass er diese eben selbst erstellt.

der Stelle asynchron in einem eigenen Task, den hier die Textbox erstellt hat

Die Textbox hat keinen Task erstellt. Da geschieht alles synchron.

* wie es ja durch das C# 7 Feature mit generalisierten "async return types" ermöglicht wurde.

Hallo sugar76,

Der Aufruf von Task.Run() kostet mehr Ressourcen als ein synchroner Aufruf.

Bei "trivialen" Validierungen würde ich diese einfach synchron durchführen, so lange das in [FAQ] Warum blockiert mein GUI? Erwähnte berücksichtigt bleibt, v.a. dass die Validierung nicht zu lange dauert.

Nur bei längeren Validierungen, wie z.B. jene die gegen eine Datenbank prüfen müssen, würde ich nur einen asynchronen Weg gehen.

Ein "Mischbetrieb" von asynchroner/synchroner Validierung ist m.E. nicht ohne weiteres möglich

Mit einem Producer/Consumer kann das ermöglicht werden. Der Producer (die UI bzw. der Code, der von der UI zur Validierung aufgerufen wird) erstellt eine Validierungs-Aufgabe und steckt diese in die Warteschlange / Queue.
Der Consumer arbeitet asynchron die Validierungs-Aufgaben ab und aktualisiert das UI entsprechend.

Dein oben gezeigter Weg via Task.Run ist im Grunde nichts anderes als der eben beschriebene Producer/Consumer Weg. Nur mit P/C bist du eine Abstraktationstufe höher als bei den Tasks und hast mehr Freiheiten. Möglich wäre z.B. die Validierungs-Aufgaben mit einer Aufwands-Eigenschaft zu versehen und so wenig aufwändige Aufgaben zur Ausführung dem Dispatcher hinzuzufügen, während aufwändigere Aufgaben via ThreadPool ausgeführt werden, etc.

mfG Gü

08.06.2018 - 21:52 Uhr

Hallo baer999,

nein das geht nicht, denn der SQL Server speichert die Dateien in einem für ihn passenden Format mit speziellen Dateinamen ab. Es sind interne Daten vom SQL Server und da sollte nicht herumgepfuscht werden -- genauso wie die eigentlichen Datenbankdateien (mdf) auch nicht bearbeitet werden sollen.

Suchfunktion über alle Dateien hinweg

Entweder selbst implementieren anhand der DB-Tabellen od. auf das Filestream-Feature verzichten und die Dateien direkt im Dateisystem speichern und in der DB nur die nötigen Metadaten.

mfG Gü

07.06.2018 - 11:53 Uhr

Hallo,

das Dashbord von Gitlab ist interessant (siehe auch angehängtes Bild für einen Snapshot). Die Interpretation dessen ist jedem selbst überlassen (Achtung auf US-Datumsformat mit M/D)

Manche Reaktionen sind einfach nur sehr trollartig und oft auch ohne vorher nur die trivialste Eigenrecherche durchzuführen.
Wirklich schlimm finde ich die Einstellungen mancher (zum Glück weniger) der Art "ich bin Open Source Contributor, daher kann und darf ich alles machen". Schade wenn sich scheinbar gescheite Leute auf diese Weise selbst disqualifizieren, denn zumindest an sozialer Intelligenz mangelt es dort gehörig.

@Abt: GitHub-XP ist wirklich cool 😃

mfG Gü

06.06.2018 - 10:41 Uhr

Hallo,

so hat MS keine Urheberrechte an den Repositories o.ä. gekauft.

Urheberrechte sind ohnehin nicht übertragbar -- zumindest bei uns.
Für US müsste wohl auch ein "Copyright transfer agreement" vorhanden sein -- das für jedes Repo bzw. GitHub-Organisation ist wohl auch eher undenkbar.

Desweiteren sind auf GH auch Google, Facebook, etc. vertreten und die könnten einen Prozess gegen MS durchaus aufnehmen und v.a. standhalten, sollte jemals eine der latenten Gefahren, die an die Wand gemalt werden, wahr werden.

Hier sehen wir, so wie es sich liest, keine Gefahr durch MS und betrachten die Situation nicht durch die MS-Basher-Brille.

der behauptet, dass Microsoft seinen Code geklaut hat.

Ich sehe da nicht mehr als ein Bashing gegen Großkonzeren, hier im speziellen MS. Einen Beweis in der ein od. anderen Art liefert er ja selbst nicht, während MS sogar eine forensische Untersuchung vom Code bzw. den Repos durchgeführt hat.

Ich finde es gut, dass MS sogar solchen Behauptungen mit Ernst nachgeht und Lizenzen sehr ernst nimmt.
In corefx hab ich auch schon ein paar mal beobachten wie ein PR abgelehnt wurde, da es lizenzrechtlich nicht passte.

mfG Gü

06.06.2018 - 10:29 Uhr

Hallo inflames2k,

du kannst auch Configuration in ASP.NET Core zusammen mit Options pattern in ASP.NET Core verwenden und dort den Pfad zur Datei selbst angeben.

Einstellungen speichern (serialisieren) sollte kein Problem sein.

mfG Gü

05.06.2018 - 13:14 Uhr

Hallo,

so richtig überrascht bin ich davon nicht, denn so bekommt MS mehr Einfluss in die Entwicklungs von GitHub und so zwischen manchen Zeilen ließ sich herauslesen, dass sie gerne manche Punkte anders hätten.

Für mich als ohnehin MS-affinen Programmierer stellt die Übernahme keine Bedrohung od. Gefährdung dar, wie sie in manchen Posts im WWW momentan zu lesen sind. Ich bin gespannt wie sich das in der Community entwickeln wird.

Interessant finde ich manche Aussagen, dass sie nicht wollen dass ihr Code bei MS lagert denn sie wissen nicht was MS damit macht. Nur gut dass es Open Source ist... 😉 (abgesehen von GitHub-private)

mfG Gü

05.06.2018 - 13:10 Uhr

Hallo filmee24,

will ein Pos programmieren

Was ist ein "Pos"?( (Vllt. hab ich auch nur die Zeit verpasst 😉

mfG Gü

05.06.2018 - 13:07 Uhr

Hallo T-Virus,

ergänzend zu Coffeebeans Antwort: wenn du z.B. ein Projekt hast, das via NuGet allgmeine verfügbar sein soll, so erreichst du mit einem niedrigeren .NET Standard mehr "TargetFrameworks" als mit einem höheren (siehe dazu auch im Link den ".NET implementation support").

Hallo weismat,

Span statt Substring

Span ist eine coole Sache. Bedenke dass eine "fast" und "portable" Variante der Span gibt.

Die schnelle Variante wird direkt durch den JIT unterstützt und ist großteils fast so performant wie (sz-) Arrays. Diese Variante wird aktuell nur von .NET Core 2.1+ unterstützt.

Die portable Variante hat keine direkte JIT-Unterstützung, sondern ist auf zusätzlichen C#-Code angewiesen, daher ist diese ein wenig langsamer als die schnelle Variante.
Vom Funktionsumfang sind beide aber ident.

Wenn ihr das Projekt nur intern verwendet und es möglich ist, so würde ich als TargetFramework direkt auf netcoreapp2.1 gehen.

Noch ein Hinweis: ich weiß nicht ob du string.Create kennst, aber das finde ich super, da so direkt mit einer Span in den String-Buffer während der Konstruktion des Strings geschrieben werden kann. Das erspart das kopieren vom Quell-Buffer zum String-Speicher.

mfG Gü

04.06.2018 - 22:26 Uhr

Hallo Abt,

den höchsten möglichen .NET Standard

warum den höchsten?

Soll das Projekt möglichst universell einsetzbar sein, so würde ich den möglichst niedrigsten .NET Standard (also z.B. 1.5 statt 2.0) verwenden.

Ist das Projekt ohnehin nur für internen Gebrauch, so den höchsten (aktuell: .NET Standard 2.0) od. wenn es rein auf .NET Core laufen kann, so dann auch dieses, da so u.U. mehr API zur Verfügung stehen.

mfG Gü

04.06.2018 - 22:22 Uhr

Hallo manullino,

WCF hat wohl einen schlecht stand bei Euch! 😉

Nein, bei mir nicht 😉
Aber entsprechend deinen Anforderungen gibt es passendere Möglichkeiten, eben jene die genannt wurden.

mfG Gü

04.06.2018 - 12:47 Uhr

Hallo weismat,

Multi-Targeting ist ein guter Weg um das zu bewerkstelligen. MS macht es bei vielen ihren Projekten auf github auch nicht anders.

nach dotnetcore migrieren?

Sofern möglich .NET STandard verwendne, denn so können die Projekte universeller verwendet werden. Ggf. auch einen Target für .NET Core 2.1 hinzufügen, da es dort coole Span-API gibt 😉

Ein alternativer Weg ist das Projekt basieren auf .NET Standard / .NET Core neu zu beginnen und den Code eher per Copy & Paste zu übertragen und so gleich die Altlasten im Code über Bord werfen. Wie z.B. bei EF und EF Core od. aber auch Asp.net und Asp.net Core.

Es kommt auf den Umfang deiner Projekte an und was das Ziel der Migration ist. Nur Migrieren um des Migrierens-Willen ist zu wenig, da kannst du es lassen...

mfG Gü

04.06.2018 - 12:37 Uhr

Hallo sugar76,

bei await wird der aktuell vorhanden SynchronizationContext "gefangen" und wenn die asynchrone Operation fertig ist und die "Continuation" (d.h. der Rest der Methode, der nach await folgt) ausgeführt wird, so wird diese mit SynchronizationContext.Post ausgeführt. Im Falle von WPF heißt das, dass die Continuation im UI-Thread ausgeführt wird. Dabei ist es egal ob die asynchrone Operation in einem anderen Thread ausgeführt od. nicht.

Mit await RefreshAsync.ConfigureAwait(false) kann das Fangen vom Sync-Context ausgeschalten werden, dann würde in deinem Beispiel der gleiche Fehler kommen, denn die Continuation würde nicht mehr im UI-Thread ausgeführt werden, sondern dort wo der aktuelle TaskScheduler es für richtig hält (also potentiell in einem ThreadPool-Thread). ConfigureAwait(false) macht daher v.a. in Library-Code sinn, denn dort ist das Fangen unnötiger Aufwand. Erst dann wenn es zurück zur UI (od. allgemein einer Thread-affinen Umgebung) geht muss die Ausführung der Continuation zurück in den entsprechendne Context delegiert werden.


async Task Do()
{
    await Task.Delay(500);
    Console.WriteLine("Hallo");
}

entspricht grob


Task Do()
{
    return Task
        .Delay(500)
        .ContinueWith(_ => Console.WriteLine("Hallo"), TaskScheduler.FromCurrentSynchronizationContext());
}

.

Während


async Task Do()
{
    await Task.Delay(500).ConfigureAwait(false);
    Console.WriteLine("Hallo");
}

folgendem entspricht:


Task Do()
{
    return Task
        .Delay(500)
        .ContinueWith(_ => Console.WriteLine("Hallo"));
}

BTW:

  
        public async void RefreshAsync()  
        {  
            ItemList.Clear();  
            IEnumerable<T> items = await Task.Run(() => GetItems());  
            ItemList.InsertRange(items);  
        }  
  

Anstatt mittels Task.Run eine synchrone Operation in einem (ThreadPool-) Thread auszuführen, wäre es besser wenn GetItems zu einer asynchronen Operation gemacht wird. Z.B. hat ADO.net und EF asynchrone Methoden wie ToListAsync mit denen der DB-Zugriff asynchron erfolgt. Genauso beim Laden via HttpClient usw.

Der Task wird mittels Task.Run(() => ...) in einem separaten Thread ausgeführt.

Mit Task.Run wird dem aktuellen TaskScheduler mitgeteilt, dass der die übergebene Aufgabe (den Delegat) für die Ausführung planen soll. Mehr nicht.
Standardmäßig verwendet der TaskScheduler den ThreadPool, d.h. die Aufgabe wird im ThreadPool ausgeführt werden.
Somit ist deine Aussage für das Standardverhalten passend, nicht jedoch im Allgemeinen 😉

mfG Gü

04.06.2018 - 12:18 Uhr

Hallo manullino,

und wenn du Web-API verwendest auf der Client-Seite dann auch die HttpClientFactory

mfG Gü

04.06.2018 - 11:42 Uhr

Hallo Kriz,

für mich ist mittlerweile als "best practice" die Konfiguration von ASP.NET Core (siehe Abts Beitrag) hervorgegangen und zwar sowohl für .NET Core als auch .NET Full.

Dies v.a. wegen (ohne bestimme Reihenfolge):* es können verschiedene Konfigurationsquellen vereint werden, die sich in der Reihenfolge des Hinzufügens zum Konfigurations-Builder überschreiben -- dadurch können z.B. sensible Daten außerhalt der "Hauptkonfiguration" gespeichert werden und zur Laufzeit werden diese vom Framework zusammengeführt

  • Konfigurationen für verschiedene Umgebungen (Debug / Production od. auch je nach Mandanten) können einfach umgesetzt werden -- ohne dass Konfigurations-Transformationen, etc. benötigt werden
  • es können Konfigurationsquellen leicht selbst erweitert werden
  • passt zusammen mit dem Options-Pattern sehr gut zu DI (dependency injection) -- lässt sich folglich auch leichter in Tests verwenden

mfG Gü

09.05.2018 - 14:29 Uhr

Hallo,

mir gefallen diese Filter nicht. So ein Automatismus ergibt eine binäre Entscheidung und das wars. Kommt der Filter zum Ergebnis dass ein Verstoss vorliegt, ohne zu wissen dass ich die Erlaubnis für die Kopie habe, was dann? herbivore hat dazu ja passende Beispiele genannt.

Oder A ist der Urheber. A gibt B eine Kopie, B veröffentlicht diesen. Kann dann A, als Urheber, sein Werk nicht mehr veröffentichen das es der Filter verbietet?

Eine "Moderation" durch Menschen hat den Vorteil, dass diskutiert und eine Lösung gefunden werden kann. Es ist also keine rein binäre Entscheidung.
Es ist auch klar, dass es für das www keine Moderation geben kann, die jeden Upload prüft. Dadurch ergibt sich eine Latenz bis eine Rechtsverletzung korrigert werden kann -- falls überhaupt. Dies finde ich aber besser als eine pauschale Annahme eines Verstossen, die dann durch die Prüfung vom Filter negiert werden kann und der Upload stattfinden kann.

in dem ich einen Uploadfilter für sinnvoll halte, nämlich dann, wenn (vorzugsweise gefakte) Fotos (oder auch Rachepornos), die eine bestimmte Person in rufschädigender oder bloßstellender Weise zeigen, immer und immer wieder neu hochgeladen werden

In solchen Fällten könnte auch die Anzahl der Kopien (sofern sie sich ermitteln lässt, sonst geschätzt) als Multiplikator für das Strafmass dienen. Das schreckt wahrscheinlich mehr ab, als ein Filter der den Upload verbietet und leicht umgangen werden kann.
Wo würde hier die Grenze zwischen sinnvollen Einsatz eines Filter und "no filter" gezogen werden?

Das Urheberrecht sowie auch die Persönlichkeitsrechte sind wichtig und gehörren geschützt. Diese jedoch per Filter zu erzwingen ist der falsche Weg.
Ich kann mir auch kaum vorstellen, dass der Filter Werke berücksichtigt die gemeinfrei werden (Regelschutzfirst endet od. der Urheber gibt es frei).

Leider wird es so sein, dass so ein Filter in der ein od. Form kommen wird. Total Kontrolle über die Bürger scheint wichtiger zu sein als deren Anliegen.

mfG Gü

09.05.2018 - 14:02 Uhr

Hallo Abt,

wie viele Anwendungen auf dem Desktop das eigentlich verpennen.

Stimm dir zu.
Vllt. da Desktop oft isoliert (Intranet od. überhaupt nur lokal) angewandt wird und daher bestimmte Möglichkeiten nicht in Betracht gezogen werden od. möglich sind.
Sonst könnte es ja auch gleich eine Web-Anwendung werden können...

Zugegeben eine sehr vereinfachte Darstellung, aber so ganz falsch finde ich sie nicht.

mfG Gü

22.04.2018 - 11:06 Uhr

Hallo Unfug,

nimm zum Verschlüsseln den CryptoStream, somit hast du nur Streams und kannst den Input zum Output kopieren (i.e. von Stream zu Stream weiterreichen).

Z.B.


private async Task SendEncrypted(Stream input, Stream output, CancellationToken ct = default)
{
	using (var aes = Aes.Create())
	using (var transform = aes.CreateEncryptor())
	using (var encryptor = new CryptoStream(output, transform, CryptoStreamMode.Write))
	{
		await input.CopyToAsync(encryptor, ct);
	}
}

So kann input ein FileStream sein und output ein NetworkStream zum Übertragen.

mfG Gü

17.04.2018 - 16:55 Uhr

Hallo Shaarigan,

ModuleHandler ist ein MarshallByRef-Object,

Somit kannst du per Remoting die Fragen 1 und 2 erledigen?
Sonst lädt dir -- wie du ja bemerkt hast -- die Runtime die Assemblies in die Default-Domain. Via Remoting (od. sonst eine IPC für AppDomains) werden die Assemblies dann nicht geladen.

mfG Gü

17.04.2018 - 16:52 Uhr

Hallo BerndFfm,

ich sehe das wie Abt.

Anhand deines Beispiels würde auch im Log stehen dass die Datei nicht gefunden wurde. Zusätzlich sollte der Kontext, aus dem heraus der Fehler entstand, mitgeloggt werden, so dass sich das Problem reproduzieren lässt.

mfG Gü

16.04.2018 - 10:27 Uhr

Hallo HeikoAdams,

unabhängig von Abts Einwand,

Kann ich die auch irgendwie in der Basis-Klasse implementieren oder brauche ich dafür dann etwa ein zusätzliches Interface?

Ja brauchst du. Entweder direkt als Interface od. auch als Basisklasse. Sonst müsstest du ganz nach oben in der Objekthierarchie zu object, aber dann ist der Vorteil der Typsicherheit weg.

BTW: es sind keine Funktionen, sondern Methoden.
Ein Funktionsaufruf und ein Methodenaufruf sind sich sehr ähnlich, aber vom Konzept her sind das zwei ganz verschieden Dinge. Ein Methodenaufruf ist das Senden einer Nachricht an ein Objekt und die Implementierung einer Methode ist die Vorschrift, wie das Objekt auf eine solche Nachricht zu reagieren hat.

mfG Gü

16.04.2018 - 10:21 Uhr

Hallo,

ich schließe es wegen xaml - WPF Build should fail if StaticResource is missing und [Hinweis] Wie poste ich richtig? Punkt 2.2, das hätte wenigstens als Crosslink angegeben werden können 😦

mfG Gü

07.04.2018 - 14:44 Uhr

Hallo App,

wenn du einen "Basis-Wissensstand" wie z.B. für C# 6 hast, so kannst du dich über Neuerungen wie von Regenwurm vorgeschlagen informieren. Desweiteren ist https://blogs.msdn.microsoft.com/dotnet/ ist ganz interessant und da gibt es oftmals auch Beispiele wie neue Features angewandt werden.

Die Zeit ist hier etwas schnelllebig geworden, daher ist ein Buch -- mit der ganzen Vorlaufzeit die so ein Werk haben muss -- oft schon nicht mehr aktuell sobald es publiziert wird.
Daher empfehle ich div. Blogs (nicht nur die offiziellen .net-Blogs) um sich am laufenden zu halten.

mfG Gü

06.04.2018 - 14:18 Uhr

Hallo Krumnix,

z.B. via Linq und Concat (sowie ToArray wenn es wieder ein Array sein soll), also


string[] result = m_ContainerSeparatorOperatorCOMPARE.Concat(m_ContainerSeparatorOperatorCALCULATE ).ToArray();

mfG Gü

05.04.2018 - 09:59 Uhr

Hallo tmase,

Der Service wird in weiterer Folge Anfragen auf meinen Client senden, die dann abgearbeitet werden müssen.

Normal ist es umgekehrt: der Client sendet Anfragen an den Service und der Service arbeitet diese ab.

Wie BhaaL schon schreibt gibt es für "Callbacks" in WCF die duplex Bindungsarten. Das setzt aber voraus, dass Service und Client in .net geschrieben sind und beide die selben WCF-Contracts verwenden.

Ist der 3rd Party Service keine .net Lösung, so könnte vllt. SignalR interessant sein.

mfG Gü

26.03.2018 - 13:18 Uhr

Hallo BlackMatrix,

kennst du das Whitepaper Introduction to TPL Dataflow? Vllt. hilft das fürs Verständnis warum und wieso manche Einstellungen standardmäßig so sind.

mfG Gü

25.03.2018 - 22:20 Uhr

Hallo Abt,

also gut ich fasse zusammen: Wenn du "Nein" sagst, sowie dass es keinen Sinn macht und du nicht weißt wieso, dann gilt automatisch deine Antwort die auch gelesen werden soll. Super! Da ist mir die Zeit zu schade um zu diskutieren.

Nur noch so viel: hast du dir einmal überlegt wo überall ein Producer/Consumer eingesetzt wird und wieviele davon ohne Limitierung auskommen? Vermutlich schon...wozu frag ich überhaupt.

Hallo zusammen,

es gibt etliche Implementierung eines Buffers für ein Producer/Consumer-Szenario die eine Limitierung / Bounded Capacity haben und das aus gutem Grund, denn es mag verschiedene Anwendungsfälle geben, in denen eine maximale Bufferkapazität nicht überschritten werden darf. BlockingCollection<T> ist so ein Beispiel für einen In-Memory Buffer der in .net dabei ist.

Zitat von: Erzeuger-Verbraucher-Problem
Ist die Aufnahmekapazität der Datenstruktur beschränkt, so soll die Zugriffsregelung ferner verhindern, dass ein erzeugender Prozess auf die Datenstruktur zugreift, wenn die Aufnahmekapazität der Datenstruktur bereits ausgeschöpft ist.

Es gibt aber auch Anwendungsfälle, bei denen ein Producer nicht blockiert werden darf. Auch hierfür gibt es gute Gründe, wie z.B. dass periodische Abtastwerte nicht "verschluckt" werden dürfen.
Für diese Fälle hat Abt passende Möglichkeiten genannt.

Hallo BlackMatrix,

ich konnte bei Stackoverflow leider noch keine passende Antwort

Kannst du dann wenigstens die andere Frage verlinken?

mfG Gü

25.03.2018 - 19:21 Uhr

Hallo Papst,

  
X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet|X509KeyStorageFlags.Exportable|X509KeyStorageFlags.UserKeySet);  
  

Lass einmal das UserKeySet weg.
In einer geteilten Umgebung wie Azure könnte das womöglich der Grund fürs Scheitern sein, da es kein "richtiges" User-Profil gibt.
Probiere


X509Certificate2 cert = new X509Certificate2(certBytes, string.Empty, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

Kennst du Using Certificates in Azure Websites Applications? (über die Aktualität kann ich leider nichts sagen).

Sollte nichts helfen, so kannst du das Zertificat auch als Ressource (resx) zur Assembly einbinden.

mfG Gü

25.03.2018 - 18:54 Uhr

Hallo Abt,

warum soll die Anwendung hart abbrechen müssen?
Der Producer ist einfach blockiert*, bis der Buffer wieder Platz hat. Standard Producer/Consumer-Szenario.

Ist es deiner Meinung nach besser wenn der Buffer "übergeht" und es so zu einer OutOfMemoryException kommt? Das kann doch keine Logik sein.

Der Buffer ist doch genau dazu da, dass Messages auflaufen dürfen,

Genau, aber nicht bis zum App-Crash, sondern nur bis zu einem bestimmten Limit.

So etwas macht absolut Sinn in meinen Augen.

* bzw. durch die TryXxx-Methoden ist sogar keine Thread-Blockade durch eine Synchronisationsprimitive nötig, sondern es kann eine alternative Ausführungspfad gewählt werden.

mfG Gü

25.03.2018 - 14:16 Uhr

Hallo,

ich sehe das so wie Sir Rufo. Der Buffer kann / muss eine Limitierung haben und wenn diese erreicht ist, so werden die Producer-Tasks blockiert. Mit der BlockingCollection<T> aus der TPL ist genau so und nur so kann sicher ein "Überlauf" verhindert werden.

Das hat auch nichts mit einer Limitierung von In-Memory zu tun od. sonst etwas.
Ließe sich durch eine andere Architekture diese Limitierung vermeiden, so wäre das besser und die Anwendung skaliert auch besser. Aber auch in solch einer Architektur sollte zur Sicherheit eine Buffer-Limitierung vorhanden sein.

mfG Gü

23.03.2018 - 18:46 Uhr

Hallo Palin,

wenn wir von der .net-Variante sprechen, so ist Random eine Klasse und keine function. Und von dieser Klasse kann abgeleitet werden, daher wäre hier eine Bezeichnung ala "PseudoRandom" hinderlich, wenn z.B. eine True-Random Implementierung abgeleitet wird.

mfG Gü

23.03.2018 - 10:37 Uhr

Hallo Caveman,

ItemsSource an eine ObservableCollection gebunden. Die Daten werden angezeigt und ich kann mit Klicken auf die Spaltenköpfe die Daten auch sortieren.

WPF verwendet dann intern eine ICollectionViewSource für das Sortieren, Filtern, etc.
Das ist aber eine "View" auf die Daten, welche selbst nicht verändert werden, und dadurch z.B. möglich wird, dass zwei od. mehr verschieden solcher Views auf die gleiche Datenbasis angewandt werden.

wie ich die sortierte Reihenfolge wieder in die ObservableCollection bekomme

Entweder du sortierst selbst die Datenbasis od. du verwendest ICollectionViewSource explizit und hast dann Zugriff auf dessen Daten.

mfG Gü

23.03.2018 - 10:30 Uhr

Hallo Papst,

habe mir die genaue Exception dummerweise auch nicht notiert und kann sie erst morgen wieder reproduzieren

Bitte poste dann die genaue Exception (komplett), denn sonst ist Ursachenforschung schwer durchführbar. Wobei FileNotFound wohl auf einen falschen Pfad hinweist unter der Annahme dass die Zertifikats-Date vorhanden ist. Gib daher durch Logging auch den Pfad aus.

Ich hoffe du kopierst ab nun die Exceptions immer und verwirfst sie erst dann wenn du sicher bist, dass sie nicht mehr benötigt wird 😉

mfG Gü

23.03.2018 - 10:16 Uhr

Hallo Palin,

ja interessant, aber so hab ich das historisch auch erwartet (ich kannte die Hintergründe und Motivation dazu vorher nicht).

In .net würde ich System.Random auch nicht anders implementieren. * Pseudo-Zufallszahlen reichen für viele Anwendungen

  • durch die Angabe eines Seeds ist die generierte Zufallsfolge deterministisch -- v.a. ein Vorteil wenn es um das Reproduzieren von Ergebnissen geht (Debuggen, Testen)
  • ist effizienter als kryptografische Zufallszahlen (wenn keine Hardwareunterstützung dafür vorhanden ist und diese genutzt wird)

In der Doku zu System.Random steht auch

Zitat von: Random Class
Represents a pseudo-random number generator

mit Verweis auf kryptografische Zufallsgeneratoren. Es sollte somit keiner in diese "Falle" tappen, der die Doku gelesen hat.

mfG Gü

21.03.2018 - 10:01 Uhr

Hallo Davaaron,

Echtzeit Syntax-Fehler anzeigen

Geht grundsätzlich über eine "Live-Compilierung", wobei die lexikalische Analyse dazu reichen sollte. D.h. bei der Eingabe im Editor wird gleich der Code geparst (in einen Syntaxbaum) und analysiert.
Um dies allerdings "flüssig" zu bewerkstelligen ist schon einiges an Programmierkunst nötig.

VS hatte früher seinen eigenen "Compiler" zur Syntaxanalyse und für Intellisense dabei. Neben dem C#-Compiler (csc.exe) gab es somit eine zweite Compiler-Plattform und da dies nicht sehr zielführend und effektiv (aus Entwicklungssicht) ist, war dies auch eine der Motivationen für Roslyn, dem C#-Compiler als Service.
Nun verwendet VS statt dem eigenen Compiler Roslyn um so Doppelgleisigkeiten zu vermeiden -- ein großer Vorteil, v.a. wenn sich die Sprache recht schnell weiterentwickelt.
Zusätzlich gibt es in VS seitdem auch die (mächtige) Möglichkeit von Analyzern um "live code refactoring" zu ermöglichen.

Wenn du das selbst entwickeln willst, so schau dir neben Abts Tipps auch Roslyn an und integriere das in dein System.

Willst du aber nur ganz simples Intellisense, so reicht ein Dictionary-Lookup bei Eingabe eines . 😉

mfG Gü